相机流式传输 - OpenCV 错误:(-215:断言失败)函数'cv::imshow'中的 size.width>0 && size.height>0



我正试图将我的相机(型号(的图像从带有复盆子操作系统的Raspberry Pi 3 B+流式传输到我的Windows 10 PC。它是有效的,但当我把白色的东西放在相机前,图像很小,但不足以在一个包中发送时,我会得到OpenCV错误:(-215:断言失败(size.width>0&size.height>函数"cv::imshow"中的0

以下是python代码和控制台输出:

发件人

import socket
import struct
import math
import cv2
import time

def main():

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
port = 60339
fs = FrameSegment(s, port, "192.168.1.29")

cap = cv2.VideoCapture(0)
print("Startet video capture")
while (cap.isOpened()):
_, frame = cap.read()
fs.udp_frame(frame)

cap.release()
cv2.destroyAllWindows()
s.close()

class FrameSegment(object):
MAX_DGRAM = 2**16
MAX_IMAGE_DGRAM = MAX_DGRAM - 64

def __init__(self, sock, port, addr):
self.s = sock
self.port = port
self.addr = addr

def udp_frame(self, img):

compress_img = cv2.imencode('.jpg', img)[1]
dat = compress_img.tostring()
size = len(dat)
num_of_segments = math.ceil(size/(self.MAX_IMAGE_DGRAM))
array_pos_start = 0

while num_of_segments:
array_pos_end = min(size, array_pos_start + self.MAX_IMAGE_DGRAM)
self.s.sendto(
struct.pack("B", num_of_segments) +
dat[array_pos_start:array_pos_end], 
(self.addr, self.port)
)
array_pos_start = array_pos_end
num_of_segments -= 1

main()

接收器

import numpy as np
import struct
import socket
import cv2

MAX_DGRAM = 2**16
index2 = False

def dump_buffer(s):
""" Emptying buffer frame """
while True:
print("Emptying Buffer")
seg, addr = s.recvfrom(MAX_DGRAM)
if struct.unpack("B", seg[0:1])[0] == 1:
print("finish emptying buffer")
break

def imageReceiver():

print("Socket setup")
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('192.168.1.29', 60339))
dat = b''
dump_buffer(s)

while True:
seg, addr = s.recvfrom(MAX_DGRAM)
index = struct.unpack("B", seg[0:1])[0]
if index > 1:
dat += seg[1:]
else:
dat += seg[1:]
img = cv2.imdecode(np.frombuffer(dat, dtype=np.uint8), 1)
cv2.imshow('frame', img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
dat = b''

cv2.destroyAllWindows()
s.close()


imageReceiver()

接收器控制台输出

Socket setup
Emptying Buffer
Emptying Buffer
finish emptying buffer
Traceback (most recent call last):
File ".RemoteControl.py", line 43, in <module>
imageReceiver()
File ".RemoteControl.py", line 34, in imageReceiver
cv2.imshow('frame', img)
cv2.error: OpenCV(4.5.1) C:UsersappveyorAppDataLocalTemp1pip-req-build-kh7iq4w7opencvmoduleshighguisrcwindow.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

可能是imshow由于某种原因接收到一个空图像。在调用imshow之前,你能记录img的形状和类型吗?

我已经运行了您的发送方和接收方脚本,工作非常完美。在我的相机前快速移动并不能消除你的错误。


while True:
seg, addr = s.recvfrom(MAX_DGRAM)
index = struct.unpack("B", seg[0:1])[0]

if index > 1:
dat += seg[1:]
else:
dat += seg[1:]
img = cv2.imdecode(np.frombuffer(dat, dtype=np.uint8), 1)
#--- Prevent crash if img is None 
if img is not None:
cv2.imshow('frame', img)
#-----------------------------------

if cv2.waitKey(1) & 0xFF == ord('q'):
break
dat = b''


最新更新