#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, если объект открыт. Простая, глупая ошибка.