OpenCV에서 카메라 캡처 해상도 증가시키기
OpenCV에서 웹캠 피드를 작업할 때 많은 개발자들이 해상도 캡처에 한계를 겪습니다. Logitech QuickCam IM과 같은 웹캠의 일반적인 시나리오는 여러 해상도를 지원하지만 낮은 설정으로 기본 설정되어, 고품질 이미지 캡처를 제한합니다. 320x240 해상도의 제한을 넘어 카메라의 해상도를 향상시키는 데 어려움을 겪어본 적이 있다면, 당신은 혼자가 아닙니다. 이 문제의 해결책을 살펴보겠습니다!
도전과제
웹캠이 640x480 및 1280x960과 같은 해상도를 지원하는 설치를 가질 수 있습니다. 그러나 C/C++ OpenCV 프로그램에서 이를 조정하려고 시도해도 320x240의 기본 해상도로만 이미지를 제공하게 됩니다. cvSetCaptureProperty()
를 사용하는 일반적인 방법은 이러한 조정에 대해 종종 효과가 없는 것으로 보입니다. 질문은: 이 제한을 어떻게 극복할 수 있을까요?
해결책
1. 소스 코드 수정하기
카메라 해상도를 높이기 위해서는 OpenCV 커뮤니티의 사용자가 공유한 해킹을 구현해야 합니다. 이는 몇 가지 헤더 파일을 수정하고 OpenCV 설정에 특정 함수를 추가하는 것을 포함합니다.
highgui.h
에 정의 추가하기
먼저, 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
에 icvSetPropertyCAM_VFW
라는 새로운 함수를 생성해야 합니다. 여기서 카메라 속성을 설정하는 작업이 이루어질 것입니다:
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);
break;
case CV_CAP_PROP_DIALOG_FORMAT:
result = capDlgVideoFormat(capture->capWnd);
break;
case CV_CAP_PROP_DIALOG_SOURCE:
result = capDlgVideoSource(capture->capWnd);
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
업데이트하기
또한, captureCAM_VFW_vtable
을 다음과 같이 업데이트해야 합니다:
static CvCaptureVTable captureCAM_VFW_vtable =
{
6,
(CvCaptureCloseFunc)icvCloseCAM_VFW,
(CvCaptureGrabFrameFunc)icvGrabFrameCAM_VFW,
(CvCaptureRetrieveFrameFunc)icvRetrieveFrameCAM_VFW,
(CvCaptureGetPropertyFunc)icvGetPropertyCAM_VFW,
(CvCaptureSetPropertyFunc)icvSetPropertyCAM_VFW, // 이제 제대로 설정됨
(CvCaptureGetDescriptionFunc)0
};
라이브러리 재빌드하기
위의 조정을 완료한 후, 마지막 단계는 highgui.dll
을 재빌드하는 것입니다. 이 통합은 프로그램이 640x480과 같은 더 높은 해상도를 활용할 수 있게 하여, 웹캠 이미지 캡처를 훨씬 더 유연하게 만듭니다.
결론
OpenCV에서 카메라 캡처 해상도를 높이는 것은 기술적인 장애물이 될 수 있지만, 올바른 수정을 통해 충분히 달성할 수 있습니다. 설명된 솔루션을 구현하면 웹캠의 고품질 이미징을 활성화하여 이 중요한 기능에 의존하는 프로젝트를 향상시킬 수 있습니다. 기본 설정에 얽매이지 말고, 웹캠의 잠재력을 활용하십시오!