在我的C/C++的程序,我使用 该版本 来捕获的图像我的摄像头。摄像机(罗技IM快看)可以捕捉的决议 320×240, 640x4801280×960.但是,出于一些奇怪的原因,该版本给我图像的分辨率 320×240 只。呼吁改变该决议的使用 cvSetCaptureProperty() 与其他决议的价值观只是不要工作。我怎么捕捉到图像的其他决议可与我的摄像头?

有帮助吗?

解决方案 2

那里似乎并不是一个解决方案。该决议可以增加 640x480 使用 这个黑客 通过共享 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_VFWcvcap.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.

其他提示

我使用该版本1.1pre1下Windows(videoinput库是用于通过默认通过这个版本,该版本在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);

我测试过它与罗技、信任和飞利浦公司的摄像头

我已经做了图像处理在linux之前跳过该版本的内置摄像头功能,因为它的(你已经发现了)不完整的。

根据你的操作系统可能有更多的运气会直到硬件通过正常渠道而不是通过该版本的.如果您使用Linux video4linux或video4linux2应该给你比较琐细的访问USB网络摄像头和可以使用libavc1394为火线。根据设备和高质量的实例码你,你应该能够获得的设备的运行参数的你想要一两个小时。

编辑,以增加:你是你自己如果它的窗口。我想这不是更困难的,但我从来没有这样做。

我强烈建议您使用 VideoInput lib, 它支持任何DirectShow设备(甚至多个设备在同一时间)和更可配置的。你花五分钟,使它发挥开源.

检查本票出:https://code.ros.org/trac/opencv/ticket/376

"解决方法是使用较新的libv4l基于包装。

  1. 安装libv4l-dev(这是怎么了它就是所谓的在Ubuntu)

  2. 重新运行cmake,你会看到"V4L/V4L2:使用libv4l"

  3. 重新运作。现在的决议是可以改变的。测试有内在的使用让在本公司."

这个固定的,它为我使用Ubuntu和可能以为你工作。

代码是我最后得到工作蟒蛇一旦Aaron焕指出我所需要的定义的论据所设置的功能之前使用它们。

#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_HEIGHT

我实证明,原因是缺少图书馆。我安装的 lib4l-dev 通过突触, 重建 该版本和问题解决了!

我布这个确保没有一个其他废物的时间在这setproperty功能。我花了2天在这看到什么似乎是工作。所以我挖出来的代码(我已经安装的图书馆第一次)。这是实际发生的事情-cvSetCaptureProperty,呼吁setProperty内CvCapture类和lo看setProperty什么都不做。它只是返回错误的。而我会拿起使用的另一个图书馆喂开源捕获的视频/图像。我使用开源2.2

cvSetCaptureProperty(捕获、CV_CAP_PROP_FRAME_WIDTH,宽度);

cvSetCaptureProperty(捕获、CV_CAP_PROP_FRAME_HEIGHT,HEIGHT);

cvQueryFrame(捕获);

不会的工作与开源2.2,但是如果您使用该版本2.1它会没事的!

如果你是在窗平台,试DirectShow(IAMStreamConfig).

http://msdn.microsoft.com/en-us/library/dd319784%28v=vs.85%29.aspx

窗下试图使用VideoInput图书馆:http://robocraft.ru/blog/computervision/420.html

我发现,在Windows(从windows98下以WinXP SP3),该版本往往会使用微软的胜利库,用于照相的访问。这个问题是,它常常是非常缓慢(说一个最大的15》框架捕获)和越野车(因此为什么cvSetCaptureProperty往往没有工作)。幸运的是,通常可以改变该决议的其他软件(特别是"第一联邦",这是一个演示的程序,方便地提供),这会影响的决议,该版本将使用。例如,可以运行的格鲁吉亚银行设定的决议为640x480,然后开源将用于通过默认,从那时开始!

但如果你可以使用一个不同窗口机访问库,例如"videoInput"图书馆 http://muonics.net/school/spring05/videoInput/ 访问的摄像机的使用非常有效的DirectShow(part of direct x).或如果你有一个专业的质量摄像头,然后往往会带来一定义API,让你访问摄像机和可以使用这一快速进入有能力改变决议和许多其他的事情。

只是一个信息可能是有价值的人具有的困难,以改变捕获默认决议(x640 480)!我尝试自己这样的问题开源2.4.x和一个罗技摄像机...并找到一个解决方法!

行我检测到的是默认的格式是作为初步参数,当摄像机捕获的开始(cvCreateCameraCapture),和所有请求的改变高度或宽度:

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, ... 

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, ...

是不可能的事后!有效了,我发现的与增加返回错误的读写能,V4l2驱回来 EBUSY 对于泰德的要求!因此,一个解决办法应该是改变的默认值中直接highgui/cap_v4l.cpp :

*#define DEFAULT_V4L_WIDTH  1280    // Originally 640* 

*#define DEFAULT_V4L_HEIGHT 720     // Originally 480*

在这之后,我只是重新编译 该版本 ...抵达到获得1280x720没有任何问题!当然,一个更好的解决应该停止获取、更改的参数,并重新启动流之后,但我没有足够的熟悉开源于这样做!

希望这将有所帮助。

米歇尔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);

应该就够了!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top