문제

내 C/C++ 프로그램에서는 다음을 사용하고 있습니다. 오픈CV 내 웹캠에서 이미지를 캡처합니다.카메라 (로지텍 QuickCam IM) 해상도로 캡처할 수 있습니다. 320x240, 640x480 그리고 1280x960.하지만 이상한 이유로 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.

다른 팁

저는 Windows에서 openCV 1.1pre1을 사용하고 있습니다(videoinput 라이브러리는 Windows에서 이 버전의 openCv에서 기본적으로 사용됩니다).

이 지침을 사용하여 카메라 해상도를 설정할 수 있습니다.cvCaptureFromCam 대신 이전 cvCreateCameraCapture를 호출합니다.

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의 내장 카메라 기능을 건너뛰었습니다.

OS에 따라 openCV를 통하는 대신 일반 채널을 통해 하드웨어로 직접 이동하는 행운이 더 많을 수도 있습니다.Linux를 사용하는 경우 video4linux 또는 video4linux2를 사용하면 USB 웹캠에 대한 비교적 간단한 액세스가 가능하며 Firewire용 libavc1394를 사용할 수 있습니다.따르는 장치와 예제 코드의 품질에 따라 한두 시간 안에 원하는 매개변수를 사용하여 장치를 실행할 수 있어야 합니다.

다음을 추가하도록 편집되었습니다.Windows라면 당신은 스스로입니다.그다지 어렵지는 않을 것 같지만 해본 적이 없습니다.

나는 강력히 사용하는 것이 좋습니다 VideoInput 라이브러리, 모든 DirectShow 장치(동시에 여러 장치 포함)를 지원하며 더 쉽게 구성할 수 있습니다.OpenCV로 플레이하는 데 5분 정도 소요됩니다.

이 티켓을 확인하세요:https://code.ros.org/trac/opencv/ticket/376

"해결책은 최신 libv4l 기반 래퍼를 사용하는 것입니다.

  1. libv4l-dev를 설치하십시오 (우분투에서는 이렇게 호출됩니다)

  2. cmake를 다시 실행하면 "V4L/V4L2:libv4l 사용"

  3. 다시 실행해 보세요.이제 해상도를 변경할 수 있습니다.MBP에 내장된 isight로 테스트되었습니다."

이것은 Ubuntu를 사용하여 문제를 해결했으며 귀하에게도 효과가 있을 수 있습니다.

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

저는 데비안과 우분투를 사용하고 있습니다. 저도 같은 문제가 있었습니다. 다음을 사용하여 비디오 입력의 해상도를 변경할 수 없었습니다. CV_CAP_PROP_FRAME_WIDTH 그리고 CV_CAP_PROP_FRAME_HEIGHT

알고 보니 그 이유는 라이브러리가 없어졌기 때문이었습니다.설치했습니다 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_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는 카메라 액세스를 위해 Microsoft의 VFW 라이브러리를 사용하는 경우가 많습니다.이것의 문제는 종종 매우 느리고(예: 최대 15FPS 프레임 캡처) 버그가 있다는 것입니다(따라서 cvSetCaptureProperty가 종종 작동하지 않는 이유).운 좋게도 일반적으로 다른 소프트웨어(특히 쉽게 사용할 수 있는 데모 프로그램인 "AMCAP")에서 해상도를 변경할 수 있으며 이는 OpenCV가 사용할 해상도에 영향을 미칩니다.예를 들어, AMCAP를 실행하여 해상도를 640x480으로 설정하면 OpenCV는 해당 시점부터 기본적으로 이를 사용합니다!

그러나 "videoInput" 라이브러리와 같은 다른 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, ...

나중에는 불가능해요!효과적으로 V4l2 드라이버가 반환하는 ioctl 함수의 반환 오류를 추가하면서 발견했습니다. 에부시 요청에 따라!따라서 한 가지 해결 방법은 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);

충분할 것입니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top