IT이야기

열린 상태에서 카메라 캡처 해상도 향상이력서

cyworld 2022. 6. 9. 22:10
반응형

열린 상태에서 카메라 캡처 해상도 향상이력서

C/C++ 프로그램에서는 OpenCV를 사용하여 웹캠에서 이미지를 캡처하고 있습니다.카메라(Logitech QuickCam IM)는 해상도 320x240, 640x4801280x960으로 캡처할 수 있습니다.하지만 이상한 이유로 OpenCV는 320x240 해상도의 이미지만 제공합니다.cvSetCaptureProperty()를 사용하여 다른 해상도 값과 함께 해상도를 변경하는 호출은 기능하지 않습니다.웹 카메라로 가능한 다른 해상도로 이미지를 캡처하려면 어떻게 해야 합니까?

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

이 지시로 카메라 해상도를 설정할 수 있습니다.cvCaptureFromCam이 아닌 이전 cvCreateCamaCapture를 호출합니다.

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 웹캠으로 테스트했습니다.

해결책은 없는 것 같다.구명벨트77이 공유하는 이 해킹을 사용하면 해상도를 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

icvSetProperty 함수를 추가합니다.CAM_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;
}

및 캡처 편집CAM_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이 리빌드 되었습니다.

저는 이전에 Linux에서 이미지 처리를 한 적이 있지만 OpenCV의 내장 카메라 기능은 (여러분이 발견하셨듯이) 불완전하기 때문에 생략했습니다.

OS에 따라서는 openCV가 아닌 일반 채널을 통해 하드웨어에 직접 접속할 수 있습니다.Linux를 사용하는 경우 video4linux 또는 video4linux2는 USB 웹캠에 대한 비교적 간단한 액세스를 제공하며 libavc1394를 firewire에 사용할 수 있습니다.디바이스와 따르는 샘플코드의 품질에 따라 1시간 또는2시간 이내에 원하는 파라미터를 사용하여 디바이스를 실행할 수 있습니다.

추가하도록 편집됨:Windows 의 경우는, 유저가 조작할 수 있습니다.그렇게 어렵지는 않을 것 같은데 해본 적은 없어요.

VideoInput lib를 사용하는 것을 강력히 권장합니다.이것은 DirectShow 디바이스(동시에 여러 디바이스도 지원)를 지원하며 설정이 용이합니다.OpenCV에서 재생하는 데 5분이 소요됩니다.

이 티켓을 체크해 주세요.https://code.ros.org/trac/opencv/ticket/376

"해결 방법은 새로운 libv4l 기반 래퍼를 사용하는 것입니다.

  1. install libv4l-dev (Ubuntu에서는 이렇게 부릅니다)

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

  3. 메이크를 재실행합니다.해상도를 변경할 수 있게 되었습니다.MBP에 내장된 Isight를 사용하여 테스트했습니다."

이것으로 Ubuntu를 사용하여 수정이 되었으니 당신에게도 도움이 될 것입니다.

코드 사용 전에 집합 함수의 인수를 정의할 필요가 있다고 Aaron Haun이 지적하자 마침내 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")

debian과 ubuntu를 사용하고 있는데 같은 문제가 있어서 CV_CAP_PROP_FRAME_WIDHCV_CAP_PROP_FRAME_HEIGHT를 사용하여 비디오 입력 해상도를 변경할 수 없었습니다.

나는 그 원인이 도서관의 분실 때문이라는 것을 알았다.synaptic을 통해 lib4l-dev설치하고 OpenCV를 재구축했더니 문제가 해결되었습니다!

이 setproperty 함수에 다른 사람이 시간을 낭비하지 않도록 하기 위해 이 글을 올립니다.이틀 동안 아무것도 작동하지 않는 것 같아서 이 작업을 했습니다.그래서 코드를 찾아냈다(처음에 라이브러리를 설치했다).이것이 실제로 발생하는 현상입니다.cvSetCaptureProperty, CvCapture 클래스 내의 setProperty 호출 및 loview setProperty는 아무것도 하지 않습니다.그냥 거짓으로 돌아옵니다.대신 다른 라이브러리를 사용하여 OpenCV에 캡처 비디오/이미지를 제공합니다.OpenCV 2.2를 사용하고 있다.

cvSetCaptureProperty(캡처, CV_CAP_PROP_FRAME_WIDW, WIDW);

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 로 비디오 입력 라이브러리를 사용해 보겠습니다.http://robocraft.ru/blog/computervision/420.html

Windows(Win98에서 WinXP SP3)에서는 OpenCV가 카메라 액세스에 Microsoft의 VFW 라이브러리를 사용하는 경우가 많습니다.이 문제의 대부분은 매우 느리고(예를 들어 최대 15 FPS 프레임 캡처), 버그가 있습니다(이 때문에 cvSetCaptureProperty가 자주 작동하지 않습니다).다행히 다른 소프트웨어(특히 쉽게 구할 수 있는 데모 프로그램인 "AMCAP")에서 해상도를 변경할 수 있으며 OpenCV가 사용하는 해상도에 영향을 미칩니다.예를 들어, AMCAP를 실행하여 해상도를 640x480으로 설정하면 OpenCV는 해당 시점 이후 기본적으로 이 해상도를 사용합니다.

다만, 「videoInput」라이브러리등의 다른 Windows 카메라 액세스 라이브러리를 사용할 수 있는 경우는, 매우 효율적인 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 드라이버가 t 요청에 대해 EBUSY를 반환하고 있다는 것을 발견했다!따라서 하나의 회피책은 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);

충분할 거야!

언급URL : https://stackoverflow.com/questions/14287/increasing-camera-capture-resolution-in-opencv

반응형