В моей программе на C/C++ я использую OpenCV для захвата изображений с веб-камеры. Камера (Logitech QuickCam IM) может снимать по разрешению 320x240, 640x480 и 1280x960. Но по какой-то странной причине OpenCV дает мне только изображения разрешения 320x240. Вызовы для изменения разрешения с использованием cvSetCaptureProperty() с другими значениями разрешения просто не работают. Как сделать снимок с помощью других разрешений с помощью веб-камеры?Увеличение разрешения захвата камеры в OpenCV
ответ
Кажется, что не существует решения. Разрешение может быть увеличено до 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.
Этот метод пропускает разрешение при 640x480? – 2012-04-05 01:25:42
Я уже занимался обработкой изображений в Linux и пропустил встроенные функции камеры OpenCV, потому что он (как вы обнаружили) неполным.
В зависимости от вашей ОС у вас может быть больше удачи прямо на аппаратное обеспечение через обычные каналы, а не через openCV. Если вы используете Linux, video4linux или video4linux2 должны предоставить вам относительно тривиальный доступ к веб-камерам USB, и вы можете использовать libavc1394 для firewire. В зависимости от устройства и качества приведенного ниже кода кода вы должны иметь возможность запустить устройство с требуемыми параметрами через час или два.
Отредактировано для добавления: Вы сами по себе, если его Windows. Я думаю, это не намного сложнее, но я никогда этого не делал.
Интересно, как мы можем сделать это в окнах? – Abc 2017-09-04 11:52:18
Я настоятельно рекомендую использовать VideoInput lib, он поддерживает любое устройство DirectShow (даже несколько устройств одновременно) и более настраивается. Вы потратите пять минут, чтобы играть в OpenCV.
Я использую 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 Веб-камеры
Работает для меня тоже на OpenCV 1.1, и я бы рекомендовал, чтобы это был принятый ответ. – 2009-07-16 23:32:43
Да, я подтверждаю, что это работает и для меня. Нынешнее принятое решение не требуется. – hoju 2009-10-13 05:13:06
Документы говорят, что это не поддерживается, но даже работает с разрешениями HD.Однако, если запрошенное разрешение недоступно с камеры, оно тихо отменит разрешение по умолчанию. Нынешнее принятое решение не требуется. – Nestor 2010-03-09 01:25:12
cvQueryFrame(capture);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, any_supported_size);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, any_supported_size);
cvQueryFrame(capture);
должно быть достаточно просто!
Попробуйте это:
capture = cvCreateCameraCapture(-1);
//set resolution
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, frameWidth);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, frameHeight);
Проверить этот билет из: https://code.ros.org/trac/opencv/ticket/376
«Решение использовать новую libv4l основе обертку
установить libv4l-DEV (. это так называется в Ubuntu)
Повторите cmake, вы увидите «V4L/V4L2: Использование libv4l»
повторный выпуск. теперь разрешение можно изменить. протестирована с встроенным Isight на MBP «.
Это установил ее для меня, используя Ubuntu и может Aswell работу за вас.
Я считаю, что в ОС 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, который позволяет вам получить доступ к камере, и вы можете использовать его для быстрого доступа с возможностью изменения разрешения и многое другое.
Под Windows пытается использовать видеоввод библиотеку: http://robocraft.ru/blog/computervision/420.html
Я использую Debian и Ubuntu, я была такая же проблема, я не мог изменить разрешение входного видеосигнала с использованием CV_CAP_PROP_FRAME_WIDTH и CV_CAP_PROP_FRAME_HEIGHT
Я выяснил, что причиной была недостающая библиотека. Я установил lib4l-dev через синаптический, восстановленный OpenCV и проблема SOLVED!
Я отправляю это, чтобы никто не тратил время на эту функцию setproperty. Я потратил 2 дня на это, чтобы увидеть, что ничего не работает. Поэтому я выкопал код (я впервые установил библиотеку). Это то, что на самом деле происходит - cvSetCaptureProperty, вызывает setProperty внутри класса CvCapture, и вот, setProperty ничего не делает. Он просто возвращает false. Вместо этого я заберу с помощью другой библиотеки, чтобы подать OpenCV видеозахват/изображения. Я использую OpenCV 2.2
cvSetCaptureProperty (захват, CV_CAP_PROP_FRAME_WIDTH, WIDTH);
cvSetCaptureProperty (захват, CV_CAP_PROP_FRAME_HEIGHT, HEIGHT);
cvQueryFrame (capture);
Это не сработает с OpenCV 2.2, но если вы используете OpenCV 2.1, он будет работать нормально!
Если вы находитесь на платформе Windows, попробуйте DirectShow (IAMStreamConfig).
http://msdn.microsoft.com/en-us/library/dd319784%28v=vs.85%29.aspx
код я, наконец, работать в 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")
Только одна информация, которая может быть ценной для людей, имеющих трудности с изменением разрешения захвата по умолчанию (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
Примечание: общее злоупотребление термином «разрешение» имеет в виду это как числа пикселов в image.This НЕ как различные стандарты описывают его. Разрешение тесно связано с SIZE пикселей, а не с NUMBER. У вас может быть 10-мегапиксельное изображение с плохим разрешением или 1MP с высоким разрешением. Даже документация на OpenCV достаточно везет, не делает этой ошибки. Фактически, если вы, например, перейдете на страницу http://docs.opencv.org/modules/superres/doc/super_resolution.html и посмотрите на ссылки внизу, вы увидите, что разрешение изображения четко отличается от количества пикселей. – rbaleksandar 2014-04-29 10:43:54