在OpenCV中增加摄像头捕捉分辨率

在我的C / C ++程序中,我使用OpenCV从我的摄像头捕捉图像。 相机( Logitech QuickCam IM )可以以320×240,640×4801280×960的分辨率进行拍摄。 但是,由于一些奇怪的原因,OpenCV给我的分辨率只有320×240的图像。 调用使用cvSetCaptureProperty()与其他分辨率值更改分辨率不起作用。 如何使用networking摄像头捕捉其他分辨率的图像?

我在Windows下使用openCV 1.1pre1(videoinput库默认使用这个版本的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); 

我已经使用罗技,信任和飞利浦networking摄像机进行了testing

似乎没有解决办法。 使用lifebelt77共享的这个hack ,分辨率可以提高到640×480 。 这里是转载的细节:

添加到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 }; 

现在重buildhighgui.dll

我之前在linux中完成了image processing,并且跳过了OpenCV内置的相机function,因为它(如您发现的那样)不完整。

根据你的操作系统,你可能有更多的运气直接通过正常的渠道硬件,而不是通过openCV。 如果您使用的是Linux,video4linux或video4linux2应该可以让您对USB摄像头进行相对简单的访问,并且可以使用libavc1394进行火线。 根据设备和示例代码的质量,您应该能够在一两个小时内使设备运行所需的参数。

编辑补充:如果你的Windows是你自己的。 我想这不是更难,但我从来没有做过。

我强烈build议使用VideoInput lib ,它支持任何DirectShow设备(甚至同时有多个设备),并且更易于configuration。 你将花费五分钟使它与OpenCV玩。

查看此票: https : //code.ros.org/trac/opencv/ticket/376

“解决scheme是使用更新的基于libv4l的包装。

  1. 安装libv4l-dev(这是在Ubuntu中调用的)

  2. 重新运行cmake,你会看到“V4L / V4L2:Using libv4l”

  3. 重新运行。 现在分辨率可以改变。 通过MBP内置的轻量级进行testing“。

这固定为我使用Ubuntu,也可能为你工作。

一旦Aaron Haun指出,我终于在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_WIDTHCV_CAP_PROP_FRAME_HEIGHTvideoinput的分辨率

我发现原因是一个缺less的图书馆。 我通过突触安装了lib4l-dev重build了 OpenCV,问题解决了!

我发布这个确保没有其他人在这个setproperty函数上浪费时间。 我花了2天的时间看到没有任何工作。 所以我挖出了代码(我第一次安装了这个库)。 这就是实际发生的事情 – cvSetCaptureProperty,调用CvCapture类中的setProperty,并注意setProperty什么也不做。 它只是返回false。 相反,我会拿起另一个库来为OpenCV提供一个捕捉video/图像。 我正在使用OpenCV 2.2

cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,WIDTH);

cvSetCaptureProperty(capture,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库进行相机访问。 这个问题是它通常非常慢(比如最多15帧捕获)和越野车(因此为什么cvSetCaptureProperty通常不起作用)。 幸运的是,您通常可以在其他软件(尤其是“AMCAP”,这是一个易于使用的演示程序)中更改分辨率,并且会影响OpenCV将使用的分辨率。 例如,您可以运行AMCAP将分辨率设置为640×480,然后在此之后OpenCV将默认使用该分辨率!

但是,如果您可以使用不同的Windows相机访问库,例如使用非常高效的DirectShow(DirectX的一部分)访问相机的“videoInput”库http://muonics.net/school/spring05/videoInput/ 。 或者,如果您拥有专业级的相机,那么通常会附带一个自定义的API,以便您访问相机,并且可以使用该API快速访问,并可以更改分辨率和其他许多function。

只有一个信息对于那些难以改变默认捕捉分辨率(640 x 480)的人来说可能是有价值的! 我用opencv 2.4.x和一个罗技相机试验了自己的问题,发现了一个解决方法!

我检测到的行为是,当摄像头捕捉开始(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。

希望它会有所帮助。

Michel BEGEY

尝试这个:

 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); 

应该就够了!