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

#c #opencv

#c #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;
}
  

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

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

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

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

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

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

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

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

1. Совместное использование модели камеры или ссылки может помочь вам в такого рода вопросах

2. @YunusTemurlenk Спасибо за ваш ответ! К сожалению, попытки «VideoCapture cap (1)», «VideoCapture cap (2)» и т. Д. Не Сработали. Камера, которую мы изначально использовали, является источником изображения DMK 33GX183. Тем не менее, я пробовал это на нескольких камерах и веб-камерах на нескольких компьютерах. Таким образом, эта проблема, по-видимому, не относится к камере-источнику изображения.

Ответ №1:

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

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

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

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

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

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

Ответ №2:

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

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

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

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