Обрезка кадра в видео

#python #opencv #crop

#python #opencv #обрезка

Вопрос:

Чего я пытаюсь добиться, так это обрезать мою рентабельность инвестиций в видеокадре в переменную, а затем дополнительно отправить ее в качестве параметра..

Рассмотрим в распознавании лиц, и что 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
  

Этой ошибки не было, когда я работал с изображениями, но на видеовходах я получаю эту ошибку.

Любое решение этой проблемы или любое альтернативное решение?

Комментарии:

1. Итак, очевидно, что кадр — это не простое изображение. Это объект, который, вероятно, содержит кадр вместе с некоторыми другими метаданными. Вам нужно выяснить структуру того, что cap.read() возвращает, и соответствующим образом изменить свой код

2. как мне это сделать?

3. Проверьте обман, который я связал

4. я проверил эту ссылку… Это не отвечает на мой вопрос. Я получаю вывод cv2.imshow («frame», frame). Но crop_frame выдает эту ошибку…

5. Вы правы насчет обмана — я пропустил _,frame , но мое первоначальное утверждение остается в силе.

Ответ №1:

По сути, вы выполняете нарезку 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(), позволяющая выполнять рендеринг, см. Документ здесь .
  • Если вы хотите, чтобы ваша переменная находилась вне цикла, вы должны определить ее вне цикла.
  • Кроме того, вы должны выбрать, какой кадр обрезать.

Вы также можете добавить 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»: цикл существует, и обрезанный кадр сохраняется как изображение.

Комментарии:

1. хорошо, я понял ваш ответ. Но что я делаю, так это то, что я использую эту концепцию для обрезки roi, например, когда лицо обнаружено в видео, я хотел бы обрезать это лицо …. код, который я упомянул выше, — это всего лишь пример, который я использовал для объяснения своего запроса. Код, который вы написали выше, просто захватывает кадр по этим координатам. Рассматривайте эти координаты как ваш roi, положение которого меняется в зависимости от видео. Что мне тогда делать?

2. Просто ответил на ваш вопрос. Неясно, в чем следующая проблема. Возможно, вы хотите обновить свой вопрос с более подробной информацией.

3. Проверьте мое редактирование: в основном вы выполняете нарезку None , когда видео заканчивается, и ни один кадр не может быть прочитан.

4. хорошо, я понял вашу точку зрения. Для обрезки нет времени рендеринга. Что я сделаю, так это реализую 2-й ваш пример и напишу код таким образом, чтобы он обнаруживал лица, но когда я нажимаю F, он обрезает лицо… Я думаю, что это может сработать