2024-05-23 22:47:55 发布
网友
我正在用python开发一个wx应用程序,用于流式传输和显示来自两个不同网络摄像头的视频。这很好,但现在我需要在另一个场景中这样做,在这个场景中,两个摄像头连接在单独的机器上,运行在通过网络连接的Windows上。我的应用程序将在计算机1上运行。可以使用opencv从照相机1获取视频并显示在面板上。我还想从连接到机器2的摄像机2获取视频,并将其显示在应用程序中。
有办法吗?
VLC可以在RTSP上传输捕获设备的图像,请参见"Streaming using the GUI" chapter of VLC's "Streaming HowTo"。
然后OpenCV的VideoCapture可以从RTSP流中获取帧,例如:
VideoCapture
std::string address = "rtsp://<username:password>@<ip_address>:<port>"; cv::VideoCapture cap; if(!cap.open(address)) { std::cout << "Error opening video stream: " << address << std::endl; return -1; }
其中address是类似于rtsp://127.0.0.1:554或rtsp://username:password@127.0.0.1:554的,如果它是密码保护的。
address
rtsp://127.0.0.1:554
rtsp://username:password@127.0.0.1:554
我用websockets在两台机器之间传输数据。您在机器1中获取图像并将其流式传输到机器2,后者正在侦听某个端口上的连接。
机器1(客户端):
cap=cv2.VideoCapture(0) clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) clientsocket.connect(('localhost',8089)) while(cap.isOpened()): ret,frame=cap.read() memfile = StringIO.StringIO() np.save(memfile, frame) memfile.seek(0) data = json.dumps(memfile.read().decode('latin-1')) clientsocket.sendall(struct.pack("L", len(data))+data) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release()
机器2(服务器线程):
self.isRunning = True s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print 'Socket created' s.bind((self.hostname, self.port)) print 'Socket bind complete' data = "" payload_size = struct.calcsize("L") s.listen(10) print 'Socket now listening' while self.isRunning: conn, addr = s.accept() while True: data = conn.recv(4096) if data: packed_msg_size = data[:payload_size] data = data[payload_size:] msg_size = struct.unpack("L", packed_msg_size)[0] while len(data) < msg_size: data += conn.recv(10000) frame_data = data[:msg_size] memfile = StringIO.StringIO() memfile.write(json.loads(frame_data).encode('latin-1')) memfile.seek(0) frame = numpy.load(memfile) ret, jpeg = cv2.imencode('.jpg', frame) self.jpeg = jpeg self.connected = True else: conn.close() self.connected = False break self.connected = False
注意,json序列化程序大大提高了序列化过程的性能,特别是与pickle相比,正如本书中所解释的那样。
可以找到源代码here。
VLC可以在RTSP上传输捕获设备的图像,请参见"Streaming using the GUI" chapter of VLC's "Streaming HowTo"。
然后OpenCV的
VideoCapture
可以从RTSP流中获取帧,例如:其中
address
是类似于rtsp://127.0.0.1:554
或rtsp://username:password@127.0.0.1:554
的,如果它是密码保护的。我用websockets在两台机器之间传输数据。您在机器1中获取图像并将其流式传输到机器2,后者正在侦听某个端口上的连接。
机器1(客户端):
机器2(服务器线程):
注意,json序列化程序大大提高了序列化过程的性能,特别是与pickle相比,正如本书中所解释的那样。
可以找到源代码here。
相关问题 更多 >
编程相关推荐