Как изменить размер кадра из видео, а затем получить окончательный размер?

1

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

Я пробовал это:

пока верно:

vs = cv2.VideoCapture(args["video"])
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
frame = vs.read()
frame = imutils.resize(frame, width=400)

# grab the frame dimensions and convert it to a blob
w, h = cv.GetSize(frame)

но получаю:

Traceback (most recent call last):
  File "real_time_object_detection.py", line 52, in <module>
    frame = imutils.resize(frame, width=400)
  File "/home/pi/.virtualenvs/cv/lib/python3.5/site-packages/imutils/convenience.py", line 69, in resize
    (h, w) = image.shape[:2]
AttributeError: 'tuple' object has no attribute 'shape'

почему он жалуется на строку в imutils/? Как я могу сделать необходимое?

Теги:
opencv
video
cv2
image-resizing

2 ответа

1
Лучший ответ

Метод read возвращает две переменные, первая - это переменные успеха, которые являются логическими (True, если кадр захвачен, иначе False), а вторая - это кадр. Скорее всего, вы читаете видео с 3-канальными кадрами, а кадр, как правило, представляет собой пустой массив, поэтому вы можете использовать атрибут shape.

Я бы предложил использовать cv2.resize для изменения размера.

vs = cv2.VideoCapture(args["video"])
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels

_, frame = vs.read()
(w, h, c) = frame.shape

#syntax: cv2.resize(img, (width, height))
img = cv2.resize(frame,(400, h))

print(w, h)
print(frame.shape)
>> 480 640
 (640, 400, 3) #rows(height), columns(width), channels(BGR)

w и h хранят исходную ширину и высоту вашего видеокадра, а img.shape имеет img.shape ширину и высоту

1

Я думаю, что передаваемая вами переменная фрейма - это не пустой массив, это кортеж. Отсюда и ошибка. Проверьте, правильно ли читается видео. сделайте print(type(frame)) и проверьте, является ли глупым, чтобы проверить, что ваше изображение читается правильно. imutils.resize() - это класс, использующий функцию cv2.resize. Вот как это работает

vs = cv2.VideoCapture(args["video"])
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
ret, frame = vs.read()


#inside of imutils.resize()
w,h,c=frame.shape
r = 400 / float(w)
dim = (400, int(h * r))
new_frame=cv2.resize(image,dim)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню