python伺服云台摄像头图像作为背景

2024-04-27 14:49:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在将鼠标悬停在图像上时,用鼠标光标控制相机的摇摄方向,同时将实时网络摄像头作为窗口背景。
我有两个独立工作的程序,第一个是云台倾斜控制,它使用一个名为servo_control.py的pololu maestro8伺服控制器。第二个是名为test_servo_webcam3.py的网络摄像头窗口和XY事件控件。在

伺服_控件.py

#!/usr/bin/env python

import serial
import time


class Servo:

    def __init__(self):
        self.ser = serial.Serial('/dev/ttyACM0')
        self.ser.baudrate = 115200
        self.ser.write(chr(0xAA))
        self.ser.flush()
        self.centre_servo()

    def centre_servo(self):
        # tvalue is for every 1/4 us so 4000=1000us
        # centre servos
        self.ser.write(chr(0x84) + chr(0x00) + chr(0x70) + chr(0x2E))
        # 0x2E70 = 0b010.1110.111.0000 = 6000 -> 1500us = zero power
        self.ser.flush()
        self.ser.write(chr(0x84) + chr(0x01) + chr(0x70) + chr(0x2E))
        # 0x2E70 = 0b010.1110.111.0000 = 6000 -> 1500us = zero power
        self.ser.flush()

    def servo_track_XY(self, channel, XYvalue):
        Xvalue = (XYvalue * 2) + 1000
        if Xvalue < 1000:
            Xvalue = 1000
        if Xvalue > 2000:
            Xvalue = 2000
        #print "X, Y", Xvalue, Yvalue
        Xvalue = round((Xvalue * 4), -1)

        MSB = int(Xvalue / 128)
        LSB = int(Xvalue - (MSB * 128))
        xchannel = int(channel)

        self.ser.flush()
        self.ser.write(chr(0x84) + chr(xchannel) + chr(LSB) + chr(MSB))
        self.ser.flush()

if __name__ == "__main__":
    prog = Servo()
    time.sleep(1)
    for num in range(0, 500):
        prog.servo_track_XY(0, num)
        prog.servo_track_XY(1, num)
        print num
        time.sleep(0.02)
    time.sleep(1)
    prog.centre_servo()

测试伺服摄像头3.py

^{pr2}$

写入的test_servo_webcam3.py将导入servo_control.py,并通过在窗口上移动鼠标来控制相机的平移和倾斜。按start应显示网络摄像头图像,但不显示网络摄像头图像。在

要使网络摄像头图像出现,伺服控制必须这样注释掉。在

    #self.pan_tilt = servo_control.Servo()

我不明白为什么通过访问伺服控制文件,网络摄像头图像没有出现。在


Tags: py图像self网络timeserwrite摄像头
2条回答

解决了。我找了很多遍才找到答案gst.parse_启动'需要一个源,该源将馈入一个过滤器,该过滤器将传递到接收器。'源->;筛选器->;接收器'。在我的程序中过滤器丢失了。一旦添加了代码函数。在

所以改变这条线

self.player = gst.parse_launch ("v4l2src ! autovideosink")

为了这个

^{pr2}$

希哈,谢谢你的评论

不确定这是否是问题的原因,但您的gtk.threads_init()gtk.main()语句的位置不正确。它们应该是Application()实例化的任一侧,而不是在类定义中:

if __name__ == "__main__":
    gtk.gdk.threads_init() # Here, or immediately after the imports
    Application()
    gtk.main()

可能是因为您正在这样做:self.pan_tilt = servo_control.Servo()在GTK被正确初始化以允许线程化之前,它在某个地方卡住了。在

也就是说,在Servo()中似乎没有任何“线程化”的东西,但我从痛苦的经历中知道,GTK可以非常对线程非常挑剔。在

相关问题 更多 >