问题描述
我正在尝试制作一个程序,该程序能够通过互联网连接到 rtsp 媒体流,在屏幕上显示流,然后通过 telnet 连接发送基于键盘输入的命令以移动相机。
>目前我使用 python 和 OpenCv 和 Telnet 模块来做到这一点。我有一个非常粗糙的版本,它通过键盘模块的热键读取键盘输入。虽然只要按住一个键就可以工作(例如按住左箭头键将相机向左平移),视频馈送会滞后很多。我尝试使用多处理,这似乎在按住某个键时略微改善了延迟,但并非完全改善。最终我想添加一个 GUI 来在相机之间移动以及使用 Tkinter 之类的东西。
python 是一种可用的语言,还是在开销较少的 c++ 中执行此操作会更聪明?还是我只是效率低下?
from telnetlib import Telnet
import cv2 as cv
from multiprocessing import Process
import sys
import keyboard as kb
#import camera_controls as cam
def pan_left():
tn.write(b'camera pan left\n')
tn.read_until(b"OK")
tn.write(b'camera pan stop\n')
tn.read_until(b"OK")
def pan_right():
tn.write(b'camera pan right\n')
tn.read_until(b"OK")
tn.write(b'camera pan stop\n')
tn.read_until(b"OK")
def tilt_up():
tn.write(b'camera tilt up\n')
tn.read_until(b"OK")
tn.write(b'camera tilt stop\n')
tn.read_until(b"OK")
def tilt_down():
tn.write(b'camera tilt down\n')
tn.read_until(b"OK")
tn.write(b'camera tilt stop\n')
tn.read_until(b"OK")
def zoom_in():
tn.write(b'camera zoom out\n')
tn.read_until(b"OK")
tn.write(b'camera zoom stop\n')
tn.read_until(b"OK")
def zoom_out():
tn.write(b'camera zoom out\n')
tn.read_until(b"OK")
tn.write(b'camera zoom stop\n')
tn.read_until(b"OK")
def home():
tn.write(b'camera home\n')
tn.read_until(b"OK")
def stream():
print("launching stream\n")
vcap = cv.VideoCapture("media stream ip")
while( True ):
ret,frame = vcap.read()
cv.imshow('VIDEO',frame)
cv.waitKey(1)
if __name__ == '__main__':
p = Process( target=stream )
p.daemon = True
p.start()
p.run()
host = 'host ip'
user = 'host username'
password = 'host password'
tn = Telnet(host,23)
tn.read_until(b"login: ")
tn.write(user.encode('ascii') + b'\n')
tn.read_until(b"Password: ")
tn.write(password.encode('ascii') + b'\n')
tn.read_until(b"Welcome admin")
kb.add_hotkey( 'a',pan_left )
kb.add_hotkey( 'd',pan_right )
kb.add_hotkey( 'w',tilt_up )
kb.add_hotkey( 's',tilt_down )
kb.add_hotkey( 'h',home )
kb.add_hotkey( 'q',end_stream )
kb.wait('esc')
tn.write(b'exit')
tn.close()
sys.exit()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)