разрешение видео python cv2

Я пытаюсь изменить разрешение видео (с mp4!) (на 800x600) таким образом: но это не работает, когда я использую cap.get(3) и (4), он каждый раз возвращает стандартное 1280x720!

import cv2
cap = cv2.VideoCapture('file')
while(cap.isOpened()):
    cv2.waitKey(10)

    ret, frame = cap.read()
    cap.set(3, 800)
    cap.set(4, 600)

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA) 
    print cap.get(3) # return default 1280       

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Что я делаю неправильно?

Я попытался -

cv2.resizeWindow("ssss", 300, 300), 

и

cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)

нет эффекта !


person TheRutubeify    schedule 10.08.2017    source источник
comment
попробуйте с вашей веб-камерой с помощью cv2.VideoCapture(0) это даст вам 800, а не 1280   -  person Kallz    schedule 10.08.2017
comment
С веб-камерой все работает, меняйте в файл! - mp4   -  person TheRutubeify    schedule 10.08.2017
comment
@TheRutubeify Если вы найдете ответ на Stack Overflow. Вы должны следовать этим правилам. stackoverflow.com/help/someone-answers. Если вы знаете ответ на вопрос. Вы должны дать ответ в панели ответов. Не давайте ответ на панели вопросов.   -  person Raksha Saini    schedule 10.08.2017


Ответы (4)


import cv2
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
    cv2.waitKey(10)

    ret, frame = cap.read()
    cap.set(3, 800)
    cap.set(4, 600)

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA) 
    print cap.get(3) # return default 1280       

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Этот ваш код работает с веб-камерой, а не с файлом

для видеофайла вы можете изменить размер окна

cv2.resizeWindow(winname, width, height) 

для этого первого определите окно с именем и измените его размер

пример

  cv2.namedWindow("frame", 0);
  cv2.resizeWindow("frame", 800,600);

для подробного изменения размера окна

person Kallz    schedule 10.08.2017
comment
Как это использовать ? cv2.resizeWindow(cap, 300, 300) в цикле? Пробовал так, без изменений( - person TheRutubeify; 10.08.2017
comment
Просто откройте новое пустое пустое окно с головой Final - person TheRutubeify; 10.08.2017
comment
@TheRutubeify cv2.imshow('frame',grey) строка меняется на cv2.imshow('Final',grey) - person Kallz; 10.08.2017
comment
Да, это полезно, потому что я не могу найти ни в документах, ни в Интернете никакого решения этой простой функции! - person TheRutubeify; 10.08.2017
comment
@TheRutubeify принимает ответ, чтобы другой пользователь также мог получить правильный ответ - person Kallz; 10.08.2017
comment
Это решение спасло меня!! - person carl; 19.07.2021

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

  1. Как описано в документации OpenCV для VideoCapture, если вы хотите получить доступ к веб-камере по умолчанию, вам нужно будет инициализировать класс следующим образом:

    cap = cv2.VideoCapture('file')
    

    Если вы пытаетесь затем изменить разрешение камеры, я предлагаю переместить две строки set прямо под инициализацией cap и выполнить это только один раз, а не каждый раз, когда вы читаете в кадре. Вы также можете использовать константы для доступа к нужным атрибутам:

    cap = cv2.VideoCapture('file')
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
    
    # Your while loop and the rest of the code...
    
  2. Если вы пытаетесь прочитать кадр из файла и хотите изменить его разрешение, вы, вероятно, захотите использовать метод resize, как описано здесь. Это нужно будет сделать внутри цикла, сразу после того, как вы прочитаете во фрейме. Это может быть что-то вроде:

    resize(ret, ret, Size(800, 600), 0, 0, INTER_CUBIC); 
    

Надеюсь, это поможет.

person m_____z    schedule 10.08.2017
comment
Пробовал cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600) Не помогает! - person TheRutubeify; 10.08.2017
comment
То же самое - cap.set(3, 800) и cap.set(4, 600), как я писал выше! - person TheRutubeify; 10.08.2017

cap.set() не действует при разрешении ниже 640,480 (по крайней мере, для моего macbook pro). Вы можете увеличить разрешение, но, например, установка его на 300,300 не имеет никакого эффекта. Что касается моего опыта, вам нужно вызвать resize() в кадре после того, как вы read() его.

person gustavz    schedule 06.02.2019
comment
То же самое для меня на macbook pro High Sierra. Всегда печатает width 640 независимо от того, что я поставил ниже 640. - person KeitelDOG; 07.03.2019

Решено:

 cv2.namedWindow("framename", 0)
 cv2.resizeWindow("framename", 800, 600)
 cv2.imshow('framename',gray)
person TheRutubeify    schedule 10.08.2017
comment
наконец, вы скопировали и вставили мой ответ, наконец, как ваш ответ - person Kallz; 14.08.2017
comment
Да, это ваш ответ, я просто ответил! Что я должен сделать ? - person TheRutubeify; 14.08.2017
comment
@TheRutubeify Когда ответ решит вашу проблему, вы можете нажать на галочку, чтобы принять его и проголосовать. Пожалуйста, не копируйте контент и не публикуйте его снова. - person Modus Tollens; 14.08.2017
comment
Понятно! Спасибо! - person TheRutubeify; 14.08.2017