Невозможно изменить разрешение захвата видео OpenCV

Проблема, с которой я столкнулся, заключается в том, что я не могу изменить разрешение захвата видео OpenCV. Разрешение всегда 640х480, не смотря ни на что. Код, который я использую, написан на C ++, и я использую opencv 3.4.8. Я создал очень простую программу для этого, и она, кажется, не работает, что бы я ни пытался.

Вот код целиком:

#include "opencv2/opencv.hpp"
using namespace cv;
int main(int argc, char** argv)
{
    VideoCapture cap(0);
    cap.set(CAP_PROP_FRAME_HEIGHT, 1080);
    cap.set(CAP_PROP_FRAME_WIDTH, 1920);


    // open the default camera, use something different from 0 otherwise;
    // Check VideoCapture documentation.
    if (!cap.open(0))
        return 0;
    for (;;)
    {
        Mat frame;
        cap.read(frame);
        if (frame.empty()) break; // end of video stream
        imshow("this is you, smile! :)", frame);
        if (waitKey(10) == 27) break; // stop capturing by pressing ESC 
    }
    // the camera will be closed automatically upon exit
    // cap.close();
    return 0;
}

Когда я запускаю приведенный выше код, кадр всегда 640x480.

Я пробовал менять разрешение с cap.set() на меньшее и большее разрешение. Я использую камеру ImageSource и знаю, что разрешения, которые я пытаюсь использовать, поддерживаются камерой, и я могу просматривать видео с этими разрешениями в другой программе.

Я пробовал использовать разные камеры / веб-камеры.

Я пробовал явно изменить API серверной части при создании объекта VideoCapture, т.е. VideoCapture cap(0, CAP_DSHOW). Я пробовал DSHOW, FFMPEG, IMAGES и т. Д.

Я пробовал запускать одну и ту же программу на разных компьютерах.

Результат всегда одно и то же разрешение 640x480.

Есть ли что-то простое, чего мне не хватает? Все остальные сообщения, которые я могу найти на SO, просто указывают на использование cap.set() для изменения ширины и высоты.


person MrMiserMeister    schedule 18.11.2020    source источник
comment
Отправка модели камеры или ссылка может помочь вам в подобных вопросах.   -  person Yunus Temurlenk    schedule 19.11.2020
comment
@YunusTemurlenk Спасибо за ответ! К сожалению, попытка использования крышки VideoCapture (1), крышки VideoCapture (2) и т. Д. Не сработала. Первоначально мы использовали камеру Imaging Source DMK 33GX183. Однако я пробовал использовать его на нескольких камерах и веб-камерах на нескольких компьютерах. Таким образом, эта проблема не связана с камерой-источником изображения.   -  person MrMiserMeister    schedule 20.11.2020


Ответы (2)


Это зависит от того, какая у вас серверная часть камеры. Как говорится в документации:

Каждый бэкэнд поддерживает свойства устройств (cv :: VideoCaptureProperties) по-разному или может вообще не поддерживать какое-либо свойство.

Также упоминается в этой документации:

Свойства чтения / записи включают много слоев. По этой цепочке может произойти какой-то неожиданный результат. Эффективное поведение зависит от оборудования устройства, драйвера и API-интерфейса.

Похоже, ваша камера не поддерживается модулем ввода-вывода OpenCV Video.

Примечание: я тоже встречал такие камеры, некоторые из них разного разрешения работают с разными числами. Например, вы можете поймать желаемое разрешение, попробовав VideoCaptur(-1), VideoCapture(1), VideoCapture(2) ...

person Yunus Temurlenk    schedule 19.11.2020

Оказывается, ошибка была в строке if (! Cap.open (0)), которую я пытался использовать, чтобы проверить, успешно ли инициализирован cap.

У меня создалось впечатление, что open просто возвращал true, если объект видеозахвата был открыт, или false в противном случае. Но на самом деле он освобождает объект видеозахвата, если он уже открыт, а затем снова открывает его.

Короче говоря, это означает, что вызовы cap.set (), которые я использовал для изменения разрешения, стирались, когда объект был повторно открыт с помощью cap.open (0). В этот момент разрешение было восстановлено до значения по умолчанию 640x480.

Я искал метод cap.isOpened (), который просто возвращает true или false, если объект открыт. Простая глупая ошибка.

person MrMiserMeister    schedule 23.11.2020