我想在将鼠标悬停在图像上时,用鼠标光标控制相机的摇摄方向,同时将实时网络摄像头作为窗口背景。
我有两个独立工作的程序,第一个是云台倾斜控制,它使用一个名为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()
我不明白为什么通过访问伺服控制文件,网络摄像头图像没有出现。在
解决了。我找了很多遍才找到答案gst.parse_启动'需要一个源,该源将馈入一个过滤器,该过滤器将传递到接收器。'源->;筛选器->;接收器'。在我的程序中过滤器丢失了。一旦添加了代码函数。在
所以改变这条线
为了这个
^{pr2}$希哈,谢谢你的评论
不确定这是否是问题的原因,但您的
gtk.threads_init()
和gtk.main()
语句的位置不正确。它们应该是Application()
实例化的任一侧,而不是在类定义中:可能是因为您正在这样做:
self.pan_tilt = servo_control.Servo()
在GTK被正确初始化以允许线程化之前,它在某个地方卡住了。在也就是说,在
Servo()
中似乎没有任何“线程化”的东西,但我从痛苦的经历中知道,GTK可以非常对线程非常挑剔。在相关问题 更多 >
编程相关推荐