在 Python 3 中通过套接字的 OpenCV 实时流视频 [英] OpenCV live stream video over socket in Python 3
问题描述
我正在尝试创建一个简单的应用程序,以使用 OpenCV 通过 Python 3 中的套接字发送实时流视频.我是 OpenCV 和套接字编程的新手,所以如果您能提供详细的答案,我将不胜感激.谢谢.
I am trying to create a simple application to send live stream video over the socket in Python 3 with OpenCV. I am new to OpenCV and socket programming so if you can provide answer in detail I will be very grateful. Thank you.
这里是sender.py
Here is 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
Here is 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
推荐答案
我是强大的VidGear 视频处理 Python 库,现在还提供 NetGear API,专门设计用于通过网络在互连系统之间实时同步传输视频帧.你试试看:
I'm the author of powerful VidGear Video Processing python library that now also provides NetGear API, which is exclusively designed to transfer video frames synchronously between interconnecting systems over the network in real-time. You try it as follows:
打开你喜欢的终端并执行以下python代码:
Open your favorite terminal and execute the following python code:
注意:您可以随时在服务器端和客户端通过按 [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.客户端:(Bare-Minimum 示例)
然后在同一系统上打开另一个终端并执行以下python代码并查看输出:
B. Client End:(Bare-Minimum example)
Then open another terminal on the same system and execute the following python code and see the output:
# 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.PAIR
和 zmq.REQ 和 zmq.REP
,支持的协议是:'tcp' 和 'ipc'
NetGear as of now supports two ZeroMQ messaging patterns: i.e zmq.PAIR
and zmq.REQ and zmq.REP
and the supported protocol are: 'tcp' and 'ipc'
更高级的用法可以在这里找到: https://abhitronix.github.io/vidgear/latest/gears/netgear/overview/
这篇关于在 Python 3 中通过套接字的 OpenCV 实时流视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!