OpenCV 在 Python 3 中通过套接字直播视频

新手上路,请多包涵

我正在尝试创建一个简单的应用程序来使用 OpenCV 通过 Python 3 中的套接字发送实时流视频。我是 OpenCV 和套接字编程的新手,所以如果您能提供详细的答案,我将不胜感激。谢谢你。

这里是 sender.py

 import socket
import time

import cv2

capture = cv2.VideoCapture(0)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('192.168.1.10', 50505))

while True:
    ret, frame = capture.read()
    data = cv2.imencode('.jpg', frame)[1].tostring()
    sock.sendall(data)
    time.sleep(2)

这是receiver.py

 import socket
import cv2
import numpy as np
import time

HOST = '192.168.1.10'
PORT = 50505

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')

s.bind((HOST, PORT))
print('Socket bind complete')

s.listen(10)
print('Socket now listening')

conn, addr = s.accept()

while True:
    data = conn.recv(8192)
    nparr = np.fromstring(data, np.uint8)
    frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    cv2.imshow('frame', frame)
    time.sleep(2)

这是错误

 receiver.py", line 29, in <module>
        cv2.imshow('frame', frame)
    cv2.error: D:\Build\OpenCV\opencv-3.4.0\modules\highgui\src\window.cpp:339:
error: (-215) size.width>0 && size.height>0 in function cv::imshow

原文由 crtIT 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 708
1 个回答

我是 VidGear Video Processing python 库的作者,该库现在还提供 NetGear API ,专门设计用于通过网络在互连系统之间实时同步传输视频帧。您尝试如下:

A. 服务器端:(最低限度示例)

打开您最喜欢的终端并执行以下 python 代码:

注意: 您可以在服务器端按键盘上的 [Ctrl+c] 随时在服务器端和客户端结束流式传输!

 # import libraries
from vidgear.gears import VideoGear
from vidgear.gears import NetGear

stream = VideoGear(source='test.mp4').start() #Open any video stream
server = NetGear() #Define netgear server with default settings

# infinite loop until [Ctrl+C] is pressed
while True:
    try:
        frame = stream.read()
        # read frames

        # check if frame is None
        if frame is None:
            #if True break the infinite loop
            break

        # do something with frame here

        # send frame to server
        server.send(frame)

    except KeyboardInterrupt:
        #break the infinite loop
        break

# safely close video stream
stream.stop()
# safely close server
writer.close()

B. 客户端:(最低限度示例)

然后在同一系统上打开另一个终端并执行以下 python 代码并查看输出:

 # import libraries
from vidgear.gears import NetGear
import cv2

#define netgear client with `receive_mode = True` and default settings
client = NetGear(receive_mode = True)

# infinite loop
while True:
    # receive frames from network
    frame = client.recv()

    # check if frame is None
    if frame is None:
        #if True break the infinite loop
        break

    # do something with frame here

    # Show output window
    cv2.imshow("Output Frame", frame)

    key = cv2.waitKey(1) & 0xFF
    # check for 'q' key-press
    if key == ord("q"):
        #if 'q' key-pressed break out
        break

# close output window
cv2.destroyAllWindows()
# safely close client
client.close()

NetGear 目前支持两种 ZeroMQ 消息传递模式:即 zmq.PAIRzmq.REQ and zmq.REP 支持的协议是: 'tcp' and 'ipc'

可以在这里找到更高级的用法: https ://abhitronix.github.io/vidgear/latest/gears/netgear/overview/

原文由 abhiTronix 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题