裁剪视频中的帧

问题描述

我要实现的目标是将视频帧中的投资回报率裁剪为一个变量,然后进一步将其作为参数发送。

考虑人脸检测,并且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”:循环存在并且裁剪的帧另存为图像。