Python 连接到远程机器的摄像头的Opencv流

Python 连接到远程机器的摄像头的Opencv流,python,opencv,live-streaming,Python,Opencv,Live Streaming,我正在用python开发一个wx应用程序,用于流式传输和显示来自两个不同网络摄像头的视频。这很好,但现在我需要在另一个场景中这样做,在这个场景中,两个摄像头连接在单独的机器上,运行在通过网络连接的Windows上。我的应用程序将在机器1上运行。摄像机1的视频可以使用opencv获取并显示在面板上。我还想从连接到机器2的摄像头2获取视频,并在应用程序中显示它 有什么方法可以做到这一点吗?VLC可以通过RTSP传输捕获设备的图像,请参阅 然后OpenCV的VideoCapture可以从RTSP流中抓

我正在用python开发一个wx应用程序,用于流式传输和显示来自两个不同网络摄像头的视频。这很好,但现在我需要在另一个场景中这样做,在这个场景中,两个摄像头连接在单独的机器上,运行在通过网络连接的Windows上。我的应用程序将在机器1上运行。摄像机1的视频可以使用opencv获取并显示在面板上。我还想从连接到机器2的摄像头2获取视频,并在应用程序中显示它


有什么方法可以做到这一点吗?

VLC可以通过RTSP传输捕获设备的图像,请参阅

然后OpenCV的
VideoCapture
可以从RTSP流中抓取帧,例如:

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;
}
std::string address=“rtsp://@;”;
cv::视频捕获帽;
如果(!cap.open(地址))
{

std::cout我使用WebSocket在两台机器之间传输数据。您在机器1中获取映像,然后将其传输到机器2,机器2正在侦听某个端口上的连接

机器1(客户端):

机器2(服务器线程):

self.isRunning=True
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
打印“已创建套接字”
s、 绑定((self.hostname,self.port))
打印“套接字绑定完成”
data=“”
有效载荷大小=结构calcsize(“L”)
s、 听(10)
打印“套接字正在侦听”
运行self.isRunning时:
conn,addr=s.accept()
尽管如此:
数据=conn.recv(4096)
如果数据:
打包消息大小=数据[:有效负载大小]
数据=数据[有效载荷大小:]
msg\u size=struct.unpack(“L”,打包的msg\u size)[0]
而len(数据)
请注意,json序列化程序大大提高了序列化过程的性能,特别是与pickle相比,如本文所述


可以找到源代码。

我尝试过这个。但我在流媒体中面临大约5秒的延迟。有没有办法减少延迟?很难说,延迟可能是由于相机或编解码器的内部缓冲区、VLC缓存或直接是网络延迟造成的。您激活了转码吗?我增加了缓存。现在没有任何明显的延迟。非常感谢您的帮助。虽然此链接可能会回答问题,但堆栈溢出时不鼓励使用仅链接的答案,您可以通过获取链接的重要部分并将其放入您的答案中来改进此答案,这样可以确保在更改或删除链接时您的答案仍然是答案:)
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()
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