#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, он обрезает лицо… Я думаю, что это может сработать