2008-08-18 2 views
50

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

+0

Примечание: общее злоупотребление термином «разрешение» имеет в виду это как числа пикселов в image.This НЕ как различные стандарты описывают его. Разрешение тесно связано с SIZE пикселей, а не с NUMBER. У вас может быть 10-мегапиксельное изображение с плохим разрешением или 1MP с высоким разрешением. Даже документация на OpenCV достаточно везет, не делает этой ошибки. Фактически, если вы, например, перейдете на страницу http://docs.opencv.org/modules/superres/doc/super_resolution.html и посмотрите на ссылки внизу, вы увидите, что разрешение изображения четко отличается от количества пикселей. – rbaleksandar 2014-04-29 10:43:54

ответ

15

Кажется, что не существует решения. Разрешение может быть увеличено до 640x480 с использованием this hack, предоставлено 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.

+0

Этот метод пропускает разрешение при 640x480? – 2012-04-05 01:25:42

5

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

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

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

+0

Интересно, как мы можем сделать это в окнах? – Abc 2017-09-04 11:52:18

5

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

41

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

С помощью этих инструкций я могу установить разрешение камеры. Обратите внимание, что я вызываю старый 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 Веб-камеры

+1

Работает для меня тоже на OpenCV 1.1, и я бы рекомендовал, чтобы это был принятый ответ. – 2009-07-16 23:32:43

+0

Да, я подтверждаю, что это работает и для меня. Нынешнее принятое решение не требуется. – hoju 2009-10-13 05:13:06

+0

Документы говорят, что это не поддерживается, но даже работает с разрешениями HD.Однако, если запрошенное разрешение недоступно с камеры, оно тихо отменит разрешение по умолчанию. Нынешнее принятое решение не требуется. – Nestor 2010-03-09 01:25:12

-3
cvQueryFrame(capture); 

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, any_supported_size); 

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, any_supported_size); 

cvQueryFrame(capture); 

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

-1

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

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

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

«Решение использовать новую libv4l основе обертку

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

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

  3. повторный выпуск. теперь разрешение можно изменить. протестирована с встроенным Isight на MBP «.

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

0

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

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

4

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

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

2

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

0

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

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

cvQueryFrame (capture);

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

5

код я, наконец, работать в Python раз Аарон Хон отметил, что мне нужно, чтобы определить аргументы функции набора перед их использованием.

#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") 
0

Только одна информация, которая может быть ценной для людей, имеющих трудности с изменением разрешения захвата по умолчанию (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 х 720 без каких-либо проблем! Конечно, лучшим решением должно быть прекращение приобретения, изменение параметров и перезапуск потока после, но я недостаточно знаком с opencv для этого!

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

Michel BEGEY