问题描述
我要实现的目标是将视频帧中的投资回报率裁剪为一个变量,然后进一步将其作为参数发送。
考虑人脸检测,并且x,y,x + w,y + h是roi的坐标,这就是人脸,我的目的是裁剪并显示该人脸。
import cv2
cap=cv2.VideoCapture("D:\\Downloads\\video2.mp4")
#x,y,w,h,will change according the video i.e. where the face is detected.
#For the purpose of explaining,i took these values.
x=50
y=100
w=75
h=90
while(cap.isOpened()):
_,frame=cap.read()
crop_frame=frame[y:y+h,x:x+w]
cv2.imshow("Frame",frame)
cv2.imshow("crop_frame",frame)
cv2.destroyAllWindows()
cap.release()
但是在执行此操作时,出现此错误:
crop_frame=frame[y:y+h,x:x+w]
TypeError: 'nonetype' object is not subscriptable
当我处理图像时并没有出现此错误,但是在视频输入时,出现此错误。
解决方法
基本上,您要在视频结束且无法读取任何帧时对None
进行切片:None[y:y+h,x:x+w]
您应该使用retval
检查是否有要处理的框架,请参阅此处的文档:cv::VideoCapture::read。
因此,请尝试以下代码作为实验:
import cv2
cap=cv2.VideoCapture("video.mp4")
while(cap.isOpened()):
ret,frame=cap.read()
if ret:
cv2.imshow("Frame",frame)
else:
print('None frame:',frame)
break
cv2.destroyAllWindows()
cap.release()
没有渲染,因为没有时间这样做,所以这就是为什么需要查看下一个示例的原因。
以一个简单的脚本为例。这些是要点:
- 首先,您的循环缺少允许渲染的waytKey()函数,请参见doc here。
- 如果要让变量不在循环中,则必须定义 在循环之外。
- 此外,您应该选择要裁剪的帧。
您还可以添加HighGui(https://docs.opencv.org/4.1.0/d7/dfc/group__highgui.html)控件来选择框架等。
import cv2
cap=cv2.VideoCapture("video.mp4")
x=50
y=100
w=75
h=90
crop_frame = None
while(cap.isOpened()):
ret,frame = cap.read()
# if ret: to be added
cv2.imshow("Frame",frame)
keypressed = cv2.waitKey(10)
if keypressed == ord('q'):
break
if keypressed == ord('f'):
crop_frame = frame[y:y+h,x:x+w]
cv2.imshow("crop_frame",crop_frame)
cv2.destroyAllWindows()
cap.release()
cv2.imwrite('crop_frame.jpg',crop_frame)
您跑步并显示视频。 按“ F”,当前帧被裁剪并显示在新窗口中。 按“ Q”:循环存在并且裁剪的帧另存为图像。