【发布时间】:2019-04-22 14:03:02
【问题描述】:
我想创建一个函数,它使用requests 从 HTTP 流中读取帧并返回每个帧。但由于流读取器基于迭代器对象(如果我理解正确的话),返回帧会破坏流。
我正在使用的代码(工作得很好,来自this 答案):
import cv2
import requests
import numpy as np
r = requests.get('http://roofcam.warwick.ac.uk/cgi-bin/faststream.jpg', stream=True)
if(r.status_code == 200):
bytes_buffer = bytes()
for chunk in r.iter_content(chunk_size=1024):
bytes += chunk
a = bytes_buffer.find(b'\xff\xd8')
b = bytes_buffer.find(b'\xff\xd9')
if a != -1 and b != -1:
jpg = bytes_buffer[a:b+2]
bytes_buffer = bytes_buffer[b+2:]
i = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
cv2.imshow('i', i)
if cv2.waitKey(1) == 27:
exit(0)
else:
print("Received unexpected status code {}".format(r.status_code))
我想做的事情的概念(如果它是一个while函数而不是for using iterator,我想工作的返回):
import cv2
import requests
import numpy as np
r = requests.get('http://roofcam.warwick.ac.uk/cgi-bin/faststream.jpg', stream=True)
def get_frame_from_stream(r):
if(r.status_code == 200):
bytes_buffer = bytes()
for chunk in r.iter_content(chunk_size=1024):
bytes_buffer += chunk
a = bytes_buffer.find(b'\xff\xd8')
b = bytes_buffer.find(b'\xff\xd9')
if a != -1 and b != -1:
jpg = bytes_buffer[a:b + 2]
bytes_buffer = bytes_buffer[b + 2:]
i = cv2.imdecode(np.fromstring(
jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
return i
else:
print("Received unexpected status code {}".format(r.status_code))
return None
while True:
if img is not None:
img = get_frame_from_stream(r)
cv2.imshow('i', img)
cv2.waitKey(0)
else:
break
所以基本上我想返回原始代码显示帧的每个帧,以便我可以对其执行一些处理。但我不明白 iter_content 究竟是如何让原始代码连续工作的。
(我不知道如何命名这个问题 - 欢迎使用更好的标题)
【问题讨论】:
-
iter_content 我相信是一个生成器类。
-
@0x52-0x75-0x63-0x79 感谢您的意见。我确实怀疑这一点,但我不确定我是否可以让它像我描述的那样工作,以及如何做到这一点。我正在尝试阅读有关产量和生成器的信息,但理论是一回事,在这种情况下我很难尝试应用它。
标签: python opencv stream iterator python-requests