Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenCV中提高相机捕获分辨率_C_Image_Opencv_Webcam_Resolutions - Fatal编程技术网

在OpenCV中提高相机捕获分辨率

在OpenCV中提高相机捕获分辨率,c,image,opencv,webcam,resolutions,C,Image,Opencv,Webcam,Resolutions,在我的C/C++程序中,我使用从我的网络摄像头中捕获图像。相机()可以以320x240、640x480和1280x960的分辨率进行拍摄。但是,出于某种奇怪的原因,OpenCV只提供分辨率为320x240的图像。使用cvSetCaptureProperty()和其他分辨率值更改分辨率的调用不起作用。如何使用我的网络摄像头以其他可能的分辨率拍摄图像?似乎没有解决方案。使用lifebelt77共享,可将分辨率提高到640x480。详情如下: 添加到highgui.h: #define CV_CAP_

在我的C/C++程序中,我使用从我的网络摄像头中捕获图像。相机()可以以320x240640x4801280x960的分辨率进行拍摄。但是,出于某种奇怪的原因,OpenCV只提供分辨率为320x240的图像。使用cvSetCaptureProperty()和其他分辨率值更改分辨率的调用不起作用。如何使用我的网络摄像头以其他可能的分辨率拍摄图像?

似乎没有解决方案。使用lifebelt77共享,可将分辨率提高到640x480。详情如下:

添加到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
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;
}
将函数icvSetPropertyCAM\u VFW添加到cvcap.cpp

#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
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\u VFW\u 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。根据所使用的设备和示例代码的质量,您应该能够在一两个小时内使用所需的参数运行设备


编辑以添加:如果其窗口为空,则您可以自行添加。我想这并不难,但我从来没有这样做过。

我强烈建议使用,它支持任何DirectShow设备(甚至同时支持多个设备),并且更易于配置。您将花五分钟的时间让它与OpenCV一起播放。

我在Windows下使用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和飞利浦的网络摄像头进行了测试

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);
签出这张票:

“解决方案是使用较新的基于libv4l的包装器

  • 安装libv4l-dev(在Ubuntu中是这样调用的)

  • 重新运行cmake,您将看到“V4L/V4L2:使用libv4l”

  • 重新运行make。现在可以更改分辨率。使用MBP上的内置isight进行测试。“

  • 这为我使用Ubuntu修复了它,也可能为你工作。

    我发现在Windows(从Win98到WinXP SP3)中,OpenCV经常使用微软的VFW库进行摄像头访问。这样做的问题是,它通常非常慢(比如说最多15 FPS的帧捕获)并且有bug(因此cvSetCaptureProperty通常不起作用)。幸运的是,您通常可以在其他软件中更改分辨率(特别是“AMCAP”,这是一个易于获得的演示程序),它将影响OpenCV使用的分辨率。例如,您可以运行AMCAP将分辨率设置为640x480,然后OpenCV将从该点开始默认使用该分辨率


    但是如果您可以使用不同的Windows摄像头访问库,例如“videoInput”库,该库使用非常高效的DirectShow(DirectX的一部分)访问摄像头。或者,如果您有专业质量的摄像头,那么它通常会附带一个自定义API,允许您访问摄像头,您可以使用该API进行快速访问,并可以更改分辨率和许多其他功能。

    在Windows下尝试使用VideoInput library:

    我正在使用debian和ubuntu,我遇到了同样的问题,我无法使用CV\u CAP\u PROP\u FRAME\u WIDTHCV\u CAP\u PROP\u FRAME\u HEIGHT更改视频输入的分辨率

    我发现原因是图书馆不见了。
    我通过synaptic安装了lib4l dev,重建了OpenCV,问题解决了

    我发布此消息是为了确保没有其他人在这个setproperty函数上浪费时间。我花了两天的时间在这件事上,以确保一切都不起作用。所以我找到了代码(我第一次安装了这个库)。这就是实际发生的情况-cvSetCaptureProperty,在CvCapture类中调用setProperty,而setProperty什么都不做。它只是返回false。 相反,我将使用另一个库为OpenCV提供一个捕获视频/图像的库。我正在使用OpenCV 2.2

    cvSetCaptureProperty(捕获,CV_CAP_PROP_FRAME_WIDTH,WIDTH)

    cvSetCaptureProperty(捕捉、CV_CAP_PROP_FRAME_高度、高度)

    cvQueryFrame(捕获)


    这在OpenCV 2.2中不起作用,但如果使用OpenCV 2.1,它将很好地工作

    如果您在windows平台上,请尝试DirectShow(IAMStreamConfig)


    当Aaron Haun指出我需要在使用set函数之前定义其参数时,我终于开始使用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, ... 
    

    以后是不可能的!实际上,通过添加ioctl函数的返回错误,我发现V4l2驱动程序正在返回EBUSYfor thet请求! 因此,一种解决方法应该是直接在highgui/cap_v4l.cpp中更改默认值:

    *#define DEFAULT_V4L_WIDTH  1280    // Originally 640* 
    
    *#define DEFAULT_V4L_HEIGHT 720     // Originally 480*
    
    之后,我重新编译了opencv。。。到达后,获得1280 x 720,没有任何问题!当然,更好的解决方法应该是停止采集,更改参数,然后重新启动流,但我没有足够的fami