Увеличение разрешения захвата камерой в OpenCV
-
08-06-2019 - |
Вопрос
В моей программе на C / C ++ я использую OpenCV чтобы снимать изображения с моей веб-камеры.Камера (Logitech QuickCam IM) может захватывать с различными разрешениями 320x240, 640x480 и 1280х960.Но, по какой-то странной причине, OpenCV выдает мне изображения с разрешением 320x240 Только.Вызовы для изменения разрешения с помощью cvSetCaptureProperty() с другими значениями разрешения просто не работает.Как мне делать снимки с другими возможными разрешениями с помощью моей веб-камеры?
Решение 2
Похоже, решения здесь нет.Разрешение может быть увеличено до 640x480 используя этот взлом разделяемый спасательный круг77.Вот воспроизведенные детали:
Добавить к 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.
Другие советы
Я использую 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
Я уже занимался обработкой изображений в Linux и пропустил встроенную в OpenCV функциональность камеры, потому что она (как вы обнаружили) неполная.
В зависимости от вашей операционной системы вам может повезти больше, если вы перейдете непосредственно к оборудованию по обычным каналам, а не через OpenCV.Если вы используете Linux, video4linux или video4linux2 должны предоставить вам относительно простой доступ к веб-камерам USB, и вы можете использовать libavc1394 для firewire.В зависимости от устройства и качества кода примера, которому вы следуете, вы сможете запустить устройство с нужными параметрами через час или два.
Отредактировано для добавления:Вы сами по себе, если это Windows.Я думаю, это не намного сложнее, но я никогда этого не делал.
Я настоятельно рекомендую использовать Библиотека видеовхода, он поддерживает любое устройство DirectShow (даже несколько устройств одновременно) и более настраиваем.Вы потратите пять минут на то, чтобы поиграть с OpenCV.
Проверьте этот билет:https://code.ros.org/trac/opencv/ticket/376
"Решение состоит в том, чтобы использовать более новую оболочку на основе libv4l.
установите libv4l-dev (именно так это называется в Ubuntu).
повторно запустите cmake, вы увидите "V4L /V4L2:Использование libv4l"
повторите создание.теперь разрешение можно изменить.тестировался со встроенным isight на MBP."
Это исправило проблему для меня, использующего Ubuntu, и, возможно, сработает и для вас.
Код, который я, наконец, начал использовать на Python, после того, как Аарон Хаун указал, что мне нужно определить аргументы функции 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 через синаптический, восстановленный Откройте OpenCV, и проблема РЕШЕНА!
Я публикую это для того, чтобы никто другой не тратил время на эту функцию setproperty.Я потратил на это 2 дня, чтобы увидеть, что, похоже, ничего не работает.Итак, я откопал код (я установил библиотеку в первый раз).Это то, что происходит на самом деле - cvSetCaptureProperty вызывает setProperty внутри класса CvCapture, и вот, setProperty ничего не делает.Он просто возвращает false .Вместо этого я воспользуюсь другой библиотекой для передачи OpenCV видео / изображений захвата.Я использую OpenCV 2.2
cvSetCaptureProperty( захват, CV_CAP_PROP_FRAME_WIDTH, ШИРИНА);
cvSetCaptureProperty( захват, CV_CAP_PROP_FRAME_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 попробуйте использовать библиотеку видеовхода:http://robocraft.ru/blog/computervision/420.html
Я обнаружил, что в Windows (от Win98 до WinXP SP3) OpenCV часто использует библиотеку Microsoft VFW для доступа к камере.Проблема с этим заключается в том, что он часто работает очень медленно (скажем, захват кадра со скоростью не более 15 кадров в секунду) и глючит (отсюда и причина, по которой cvSetCaptureProperty часто не работает).К счастью, обычно вы можете изменить разрешение в другом программном обеспечении (в частности, в "AMCAP", которая является легко доступной демонстрационной программой), и это повлияет на разрешение, которое будет использовать OpenCV.Например, вы можете запустить AMCAP, чтобы установить разрешение 640x480, и тогда 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 ЭБУСИ по вашим просьбам !Следовательно, одним из обходных путей должно быть изменение значения по умолчанию непосредственно в highgui/cap_v4l.cpp :
*#define DEFAULT_V4L_WIDTH 1280 // Originally 640*
*#define DEFAULT_V4L_HEIGHT 720 // Originally 480*
После этого я просто перекомпилировал opencv ...и прибыл, чтобы получить разрешение 1280 x 720 без каких -либо проблем!Конечно, лучшим решением должно быть остановить сбор данных, изменить параметры и перезапустить поток после этого, но я недостаточно знаком с 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);
должно быть как раз достаточно!