我正在尝试制作一个程序,该程序能够通过互联网连接到 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()