我正在尝试将我用相机捕捉到的实时视频帧发送到服务器并进行处理。我使用opencv进行图像处理,使用python进行语言处理。以下是我的代码
一月一日
import cv2
import numpy as np
import socket
import sys
import pickle
cap=cv2.VideoCapture(0)
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect(('localhost',8089))
while True:
ret,frame=cap.read()
print sys.getsizeof(frame)
print frame
clientsocket.send(pickle.dumps(frame))
一个月一个月
import socket
import sys
import cv2
import pickle
import numpy as np
HOST=''
PORT=8089
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(80)
print sys.getsizeof(data)
frame=pickle.loads(data)
print frame
cv2.imshow('frame',frame)
这段代码给了我文件结束错误,这是合乎逻辑的,因为数据总是不断地进入服务器,pickle不知道什么时候结束。我在互联网上的搜索使我使用pickle,但它目前还不工作。
注意:我将conn.recv
设置为80,因为当我说print sys.getsizeof(frame)
时,得到的数字就是80。
7条答案
按热度按时间bis0qfac1#
几件事:
sendall
而不是send
,因为不能保证一次发送所有内容pickle
对于数据序列化是可以的,但是你必须为你在客户端和服务器之间交换的消息制定一个你自己的协议,这样你就可以提前知道要读取的数据量以进行解pickle(见下文)recv
,如果接收大块,您将获得更好的性能,因此将80替换为4096或更多sys.getsizeof
:它返回内存中对象的大小,该大小与通过网络发送的字节的大小(长度)不同;对于Python字符串,这两个值完全不同协议示例:
客户端_cv.py
服务器_cv.py
您可能可以对所有这些进行大量优化(减少复制,使用缓冲区接口等),但至少您可以了解这些想法。
vtwuwzda2#
经过几个月的互联网搜索,这是我想出的,我已经整齐地 Package 成类,与单元测试和文档作为SmoothStream检查出来,这是唯一的简单和工作版本的流我可以找到任何地方。
我用这个代码把我的代码包起来。
Viewer.py
Streamer.py
uemypmqf3#
我修改了@mguijarr的代码,以便使用Python 3。
data
现在是byte literal而不是字符串文字Server.py
Client.py
zkure5ic4#
正如@罗汉Sawant所说,我使用了zmq库而没有使用base64编码。下面是新的代码
Streamer.py
Viewer.py
8mmmxcuj5#
我有点晚了,但我强大的线程化VidGear视频处理python库现在提供了NetGear API,它专门设计用于通过网络在互连系统之间实时同步传输视频帧。
A.服务器端:(最低限度示例)
打开您喜欢的终端并执行以下python代码:
**注意:**您可以在服务器端按下键盘上的[Ctrl+c],随时结束服务器端和客户端上的流!
B.客户端:(最低限度示例)
然后打开同一系统上的另一个终端,执行以下python代码并查看输出:
更多高级用法和相关文档可在此处找到:https://github.com/abhiTronix/vidgear/wiki/NetGear
z2acfund6#
最近我发布了imagiz包快速和无阻塞的网络直播视频流与OpenCV和ZMQ。
https://pypi.org/project/imagiz/
委托单位:
伺服器:
elcex8rz7#
我已经在我的MacOS上工作了。
我使用了@mguijarr中的代码,并将struct.pack从“H”更改为“L”。
第一个