Увеличение разрешения захвата камеры в OpenCV

В моей программе на C / C ++ я использую OpenCV для захвата изображений с веб-камеры. Камера ( Logitech QuickCam IM ) может снимать с разрешением 320×240 , 640×480 и 1280×960 . Но по какой-то странной причине OpenCV дает мне только изображения с разрешением 320×240 . Вызовы для изменения разрешения с использованием cvSetCaptureProperty () с другими значениями разрешения просто не работают. Как сделать снимок с помощью других разрешений с помощью веб-камеры?

Я использую openCV 1.1pre1 под Windows (видеоинтегрированная библиотека используется по умолчанию этой версией openCv под windowsми).

С помощью этих инструкций я могу установить разрешение камеры. Обратите внимание, что я вызываю старый cvCreateCameraCapture вместо cvCaptureFromCam.

capture = cvCreateCameraCapture(cameraIndex); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 ); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 ); videoFrame = cvQueryFrame(capture); 

Я тестировал его с помощью веб-камер Logitech, Trust и Philips

Кажется, не существует решения. Разрешение может быть увеличено до 640×480, используя этот взломанный ресурс lifebelt77 . Вот репродукция деталей:

Добавить в highgui.h :

 #define CV_CAP_PROP_DIALOG_DISPLAY 8 #define CV_CAP_PROP_DIALOG_FORMAT 9 #define CV_CAP_PROP_DIALOG_SOURCE 10 #define CV_CAP_PROP_DIALOG_COMPRESSION 11 #define CV_CAP_PROP_FRAME_WIDTH_HEIGHT 12 

Добавьте функцию icvSetPropertyCAM_VFW в cvcap.cpp :

 static int icvSetPropertyCAM_VFW( CvCaptureCAM_VFW* capture, int property_id, double value ) { int result = -1; CAPSTATUS capstat; CAPTUREPARMS capparam; BITMAPINFO btmp; switch( property_id ) { case CV_CAP_PROP_DIALOG_DISPLAY: result = capDlgVideoDisplay(capture->capWnd); //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEODISPLAY,0,0); break; case CV_CAP_PROP_DIALOG_FORMAT: result = capDlgVideoFormat(capture->capWnd); //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOFORMAT,0,0); break; case CV_CAP_PROP_DIALOG_SOURCE: result = capDlgVideoSource(capture->capWnd); //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOSOURCE,0,0); break; case CV_CAP_PROP_DIALOG_COMPRESSION: result = capDlgVideoCompression(capture->capWnd); break; case CV_CAP_PROP_FRAME_WIDTH_HEIGHT: capGetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO)); btmp.bmiHeader.biWidth = floor(value/1000); btmp.bmiHeader.biHeight = value-floor(value/1000)*1000; btmp.bmiHeader.biSizeImage = btmp.bmiHeader.biHeight * btmp.bmiHeader.biWidth * btmp.bmiHeader.biPlanes * btmp.bmiHeader.biBitCount / 8; capSetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO)); break; default: break; } return result; } 

и отредактируйте captureCAM_VFW_vtable следующим образом:

 static CvCaptureVTable captureCAM_VFW_vtable = { 6, (CvCaptureCloseFunc)icvCloseCAM_VFW, (CvCaptureGrabFrameFunc)icvGrabFrameCAM_VFW, (CvCaptureRetrieveFrameFunc)icvRetrieveFrameCAM_VFW, (CvCaptureGetPropertyFunc)icvGetPropertyCAM_VFW, (CvCaptureSetPropertyFunc)icvSetPropertyCAM_VFW, // was NULL (CvCaptureGetDescriptionFunc)0 }; 

Теперь перестроен файл highgui.dll .

Я уже занимался обработкой изображений в Linux и пропустил встроенные функции камеры OpenCV, потому что он (как вы обнаружили) был неполным.

В зависимости от вашей ОС у вас может быть больше удачи, идущих прямо на аппаратное обеспечение через обычные каналы, а не через openCV. Если вы используете Linux, video4linux или video4linux2 должны предоставить вам относительно тривиальный доступ к веб-камерам USB, и вы можете использовать libavc1394 для firewire. В зависимости от устройства и качества приведенного ниже кода кода вы должны иметь возможность запустить устройство с требуемыми параметрами через час или два.

Отредактировано для добавления: вы сами по себе, если его Windows. Я думаю, это не намного сложнее, но я никогда этого не делал.

Я настоятельно рекомендую использовать VideoInput lib , он поддерживает любое устройство DirectShow (даже несколько устройств одновременно) и более настраивается. Вы потратите пять минут, чтобы играть в OpenCV.

Проверьте этот билет: https://code.ros.org/trac/opencv/ticket/376

«Решение заключается в использовании новой оболочки на основе libv4l.

  1. установить libv4l-dev (так оно называется в Ubuntu)

  2. reerun cmake, вы увидите «V4L / V4L2: Использование libv4l»

  3. повторить. теперь разрешение можно изменить. протестировано со встроенным изотроном на MBP ».

Это фиксировало это для меня, используя Ubuntu и, возможно, также работа для вас.

Код Я, наконец, работал на Python, как только Aaron Haun указал, что мне нужно определить аргументы функции set перед их использованием.

 #Camera_Get_Set.py #By Forrest L. Erickson of VRX Company Inc. 8-31-12. #Opens the camera and reads and reports the settings. #Then tries to set for higher resolution. #Workes with Logitech C525 for resolutions 960 by 720 and 1600 by 896 import cv2.cv as cv import numpy CV_CAP_PROP_POS_MSEC = 0 CV_CAP_PROP_POS_FRAMES = 1 CV_CAP_PROP_POS_AVI_RATIO = 2 CV_CAP_PROP_FRAME_WIDTH = 3 CV_CAP_PROP_FRAME_HEIGHT = 4 CV_CAP_PROP_FPS = 5 CV_CAP_PROP_POS_FOURCC = 6 CV_CAP_PROP_POS_FRAME_COUNT = 7 CV_CAP_PROP_BRIGHTNESS = 8 CV_CAP_PROP_CONTRAST = 9 CV_CAP_PROP_SATURATION = 10 CV_CAP_PROP_HUE = 11 CV_CAPTURE_PROPERTIES = tuple({ CV_CAP_PROP_POS_MSEC, CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIO, CV_CAP_PROP_FRAME_WIDTH, CV_CAP_PROP_FRAME_HEIGHT, CV_CAP_PROP_FPS, CV_CAP_PROP_POS_FOURCC, CV_CAP_PROP_POS_FRAME_COUNT, CV_CAP_PROP_BRIGHTNESS, CV_CAP_PROP_CONTRAST, CV_CAP_PROP_SATURATION, CV_CAP_PROP_HUE}) CV_CAPTURE_PROPERTIES_NAMES = [ "CV_CAP_PROP_POS_MSEC", "CV_CAP_PROP_POS_FRAMES", "CV_CAP_PROP_POS_AVI_RATIO", "CV_CAP_PROP_FRAME_WIDTH", "CV_CAP_PROP_FRAME_HEIGHT", "CV_CAP_PROP_FPS", "CV_CAP_PROP_POS_FOURCC", "CV_CAP_PROP_POS_FRAME_COUNT", "CV_CAP_PROP_BRIGHTNESS", "CV_CAP_PROP_CONTRAST", "CV_CAP_PROP_SATURATION", "CV_CAP_PROP_HUE"] capture = cv.CaptureFromCAM(0) print ("\nCamera properties before query of frame.") for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)): # camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo] foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i]) camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo] # print str(camera_values) print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo) print ("\nOpen a window for display of image") cv.NamedWindow("Camera", 1) while True: img = cv.QueryFrame(capture) cv.ShowImage("Camera", img) if cv.WaitKey(10) == 27: break cv.DestroyWindow("Camera") #cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1024) #cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 768) cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1600) cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 896) print ("\nCamera properties after query and display of frame.") for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)): # camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo] foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i]) camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo] # print str(camera_values) print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo) print ("/nOpen a window for display of image") cv.NamedWindow("Camera", 1) while True: img = cv.QueryFrame(capture) cv.ShowImage("Camera", img) if cv.WaitKey(10) == 27: break cv.DestroyWindow("Camera") 

Я использую debian и ubuntu, у меня была такая же проблема, я не мог изменить разрешение видеовхода, используя CV_CAP_PROP_FRAME_WIDTH и CV_CAP_PROP_FRAME_HEIGHT

Я выяснил, что причиной была недостающая библиотека. Я установил lib4l-dev через synaptic, восстановил OpenCV, и проблема решена!

Я публикую это, чтобы гарантировать, что никто больше не тратит время на эту функцию setproperty. Я потратил 2 дня на это, чтобы увидеть, что ничего не работает. Поэтому я выкопал код (я впервые установил библиотеку). Это то, что на самом деле происходит – cvSetCaptureProperty, вызывает setProperty внутри classа CvCapture, и вот, setProperty ничего не делает. Он просто возвращает false. Вместо этого я возьмусь за использование другой библиотеки, чтобы подавать OpenCV видео / изображения захвата. Я использую OpenCV 2.2

cvSetCaptureProperty (захват, CV_CAP_PROP_FRAME_WIDTH, WIDTH);

cvSetCaptureProperty (захват, CV_CAP_PROP_FRAME_HEIGHT, HEIGHT);

cvQueryFrame (захват);

Это не будет работать с OpenCV 2.2, но если вы используете OpenCV 2.1, он будет работать нормально!

Если вы находитесь на платформе Windows, попробуйте DirectShow (IAMStreamConfig).

http://msdn.microsoft.com/en-us/library/dd319784%28v=vs.85%29.aspx

В Windows попробуйте использовать библиотеку VideoInput: http://robocraft.ru/blog/computervision/420.html

Я обнаружил, что в Windows (от Win98 до WinXP SP3) OpenCV часто использует библиотеку VFW Microsoft для доступа к камерам. Проблема заключается в том, что он часто очень медленный (скажем, максимум 15 кадров FPS) и глючит (поэтому почему cvSetCaptureProperty часто не работает). К счастью, вы обычно можете изменить разрешение в другом программном обеспечении (в частности, «AMCAP», которое представляет собой демонстрационную программу, которая легко доступна), и это повлияет на разрешение, которое будет использовать OpenCV. Например, вы можете запустить AMCAP для установки разрешения на 640×480, а затем OpenCV будет использовать это по умолчанию с этого момента!

Но если вы можете использовать другую библиотеку доступа к камерам Windows, такую ​​как библиотека видеовхода http://muonics.net/school/spring05/videoInput/, которая обращается к камере с использованием очень эффективного DirectShow (часть DirectX). Или, если у вас есть камера профессионального качества, то часто она будет поставляться с пользовательским API, который позволяет вам получить доступ к камере, и вы можете использовать его для быстрого доступа с возможностью изменения разрешения и многое другое.

Только одна информация, которая может быть ценной для людей, испытывающих трудности с изменением разрешения захвата по умолчанию (640 x 480)! Я экспериментировал с такой проблемой с opencv 2.4.x и одной камерой Logitech … и нашел одно обходное решение!

Поведение, которое я обнаружил, заключается в том, что формат по умолчанию устанавливается в качестве начальных параметров при запуске захвата камеры (cvCreateCameraCapture) и все запросы на изменение высоты или ширины:

 cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, ... 

или

 cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, ... 

после этого не возможны! Фактически, я обнаружил с добавлением обратной ошибки функций ioctl, которые драйвер V4l2 возвращает EBUSY для этих запросов! Поэтому одним из способов может быть изменение значения по умолчанию непосредственно в файле highgui / cap_v4l.cpp:

 *#define DEFAULT_V4L_WIDTH 1280 // Originally 640* *#define DEFAULT_V4L_HEIGHT 720 // Originally 480* 

После этого я просто перекомпилировал opencv … и пришел, чтобы получить 1280 x 720 без каких-либо проблем! Конечно, лучшим решением должно быть прекращение приобретения, изменение параметров и перезапуск streamа после, но я недостаточно знаком с opencv для этого!

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

Мишель БЕГЕЙ

Попробуй это:

 capture = cvCreateCameraCapture(-1); //set resolution cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, frameWidth); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, frameHeight); 
 cvQueryFrame(capture); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, any_supported_size ); cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, any_supported_size); cvQueryFrame(capture); 

должно быть достаточно!

Давайте будем гением компьютера.