程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在python opencv中通过网络发送实时视频帧大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在python opencv中通过网络发送实时视频帧?

开发过程中遇到在python opencv中通过网络发送实时视频帧的问题如何解决?下面主要结合日常开发的经验,给出你关于在python opencv中通过网络发送实时视频帧的解决方法建议,希望对你解决在python opencv中通过网络发送实时视频帧有所启发或帮助;

几样东西:

  • 使用sendall而不是send因为您不能保证一切都将一口气发送
  • pickle 可以进行数据序列化,但是您必须为在客户端和服务器之间交换的消息建立自己的协议,这样您可以提前知道要读取的数据量以进行拆箱(请参阅下文)
  • 因为recv如果收到大块,您将获得更好的性能,因此将80替换为4096甚至更多
  • 当心sys.getsizeof:它返回内存中对象的大小,该大小与通过网络发送的字节的大小(长度)不同;对于Python字符串,两个值根本不相同
  • 请注意您要发送的帧的大小。下面的代码支持最大65535的框架。如果框架较大,请将“ H”更改为“ L”。

协议示例:

clIEnt_cv.py

@H_301_28@import cv2 import numpy as np import socket import sys import pickle import struct ### new code cap=cv2.VIDeoCapture(0) clIEntsocket=socket.socket(socket.AF_INET,socket.soCK_STREAM) clIEntsocket.connect(('localhost',8089)) while True: ret,frame=cap.read() data = pickle.dumps(framE) ### new code clIEntsocket.sendall(struct.pack("H", len(data))+data) ### new code

server_cv.py

@H_301_28@import socket import sys import cv2 import pickle import numpy as np import struct ## new 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() ### new data = "" payload_size = struct.calcsize("H") while True: while len(data) < payload_size: data += conn.recv(4096) packed_msg_size = data[:payload_size] data = data[payload_size:] msg_size = struct.unpack("H", packed_msg_sizE)[0] while len(data) < msg_size: data += conn.recv(4096) frame_data = data[:msg_size] data = data[msg_size:] ### frame=pickle.loads(frame_data) print frame cv2.imshow('frame',framE)

您可能可以对所有这些进行很多优化(减少复制,使用缓冲区接口等),但至少您可以理解。

解决方法

我正在尝试将用相机捕获的实时视频帧发送到服务器并进行处理。我使用usig opencv进行图像处理,使用python进行语言处理。这是我的代码

client_cv.py

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))

server_cv.py

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不知道何时完成。我在互联网上进行的搜索使我使用了泡菜,但到目前为止还不能用。

注意 :我设置conn.recv为80,因为那是我说时得到的数字print sys.getsizeof(framE)

大佬总结

以上是大佬教程为你收集整理的在python opencv中通过网络发送实时视频帧全部内容,希望文章能够帮你解决在python opencv中通过网络发送实时视频帧所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。