当前位置: 首页 > 面试题库 >

在python opencv中通过网络发送实时视频帧

宓季同
2023-03-14
问题内容

我正在尝试将用相机捕获的实时视频帧发送到服务器并进行处理。我使用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)


问题答案:

几样东西:

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

协议示例:

client_cv.py

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

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)

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



 类似资料:
  • 通过网络来发送CAN信息 一旦你能够通过远程漏洞利用来发送CAN信息,那么弄清楚发送哪些信息来影响其物理系统就是小菜一碟了。先前,我们用了整年的时间来弄明白应该向福特和丰田汽车发送哪些信息,所以我们也没有着急也在吉普车上做这样的工作。不过,我们确实也做了少量的一些工作来证明汽车的哪些物理系统是可以通过远程漏洞利用来控制,但是,这并不是我们研究的主要目的。 常规的CAN信息 正如在先前的研究中讨论过

  • 当我尝试上传16.9 MB大小的MP4视频时,使用ajax async post将其上传到PHP文件,控制台会触发一个错误,提示:posthttp://website.com/proc_vids.phpnet::ERR_EMPTY_响应 我知道这个问题与PHP内存限制有关,因为当我设置为200 MB时,一切正常,但当我将其更改回100 MB时,就会发生此错误。 我甚至无法将POST发送到PHP变量

  • 问题内容: 有谁知道如何使用HTML5 WebSocket在Web应用程序中实现IP语音/视频? 如果我可以用PHP或Python来实现它,那就太好了,因为(不幸的是)我目前不知道任何其他编程语言。 一个好的教程以及一个我必须付费的已经构建好的解决方案都可以。 更新1: 添加了视频,因为它不仅与音频/语音相关。 Update2: 第一个HTML5视频会议应用程序已创建。 看我自己的答案 问题答案:

  • 问题内容: 我有两个可以同时访问互联网的网络接口(WiFi和以太网)。假设我的界面是(以太网)和(wifi)。我需要特定的请求才能通过接口,其他需要通过。 就像是: 我正在使用,但是我可以使用或如果没有任何方法可以使用它。 问题答案: 我找到了使用的方法。这就像一个魅力。 我让问题悬而未决,希望有人可以使用给出答案。

  • 如何在Android中通过任何视频链接播放视频(例如—https://youtu.be/SiD77g9KfhA“也可以是另一个媒体门户的另一个视频链接)。我尝试过这样做,但遇到了一个错误。 我的代码 错误。

  • 我正在将自己的iOS推送服务迁移到亚马逊SNS。以前,我通过我们自己的服务器推送消息,这已经不够了。 后端是用PHP构建的,这是我如何使用旧解决方案发送推送通知的一些代码: 这是我发送的通知的正文。现在,我想使用AWS PHP SDK发布方法,通过SNS发送相同的通知。 我发现我必须通过这个发送推送通知: 在上面的代码示例中,$message是什么?感谢所有的帮助! 编辑:我已经用下面的JSON通