如何使用OpenCV从python中的NamedTempFile中读取视频
问题描述:
我想从视频中读取帧,但在提取帧后视频无用。所以我决定使用TempFile模块。但是我使用cv2.VideoCapture(NamedTempFile.name)
得到的帧始终是黑色的。我想知道这是否是正确的做法。如果没有,有没有更好的办法? 我在下面附上了我的代码的视频捕获部分。
另外我怀疑get_temp_video函数可能是错误的。如何使用OpenCV从python中的NamedTempFile中读取视频
def get_temp_video(url, temp_file):
r = requests.get(url, stream=True)
for chunk in r.iter_content(chunk_size=1024):
if chunk:
temp_file.write(chunk)
return temp_file
def get_frame(video_url):
named_temp_file = NamedTemporaryFile()
named_temp_file = get_temp_video(video_url, named_temp_file)
named_temp_file.seek(0)
video = cv2.VideoCapture(named_temp_file.name)
while video.isOpened():
ret, frame = video.read()
if ret:
temp_file = TemporaryFile()
np.save(temp_file, frame)
temp_file.seek(0)
upload_to_some_where(temp_file.read())
temp_file.close()
else:
break
video.release()
named_temp_file.close()
答
我猜问题是你的函数upload_to_some_where
,因为其余代码为我工作得很好。出于测试目的,我稍微修改了您的代码:
def get_temp_video(url, temp_file):
r = requests.get(url, stream=True)
for chunk in r.iter_content(chunk_size=1024):
if chunk:
temp_file.write(chunk)
return temp_file
def get_frame(video_url):
named_temp_file = NamedTemporaryFile()
named_temp_file = get_temp_video(video_url, named_temp_file)
named_temp_file.seek(0)
video = cv2.VideoCapture(named_temp_file.name)
while video.isOpened():
ret, frame = video.read()
if ret:
# For testing purpose
cv2.imshow("frame", frame)
if cv2.waitKey(25) == ord('q'):
break
##############################
# temp_file = TemporaryFile()
# np.save(temp_file, frame)
# temp_file.seek(0)
# upload_to_some_where(temp_file.read())
# temp_file.close()
else:
break
video.release()
named_temp_file.close()
if __name__=='__main__':
get_frame('http://samples.mplayerhq.hu/MPEG-4/MPEG4%20by%20philips.mp4')
感谢您的回答。我发现错误在哪里。就像你的回答,upload_to_some_where函数中的某些逻辑是错误的, –