การเพิ่มความละเอียดการจับภาพจากกล้องใน OpenCV
เมื่อทำงานกับไฟล์แสดงภาพจากกล้องเว็บใน OpenCV นักพัฒนาหลายคนเผชิญข้อจำกัดด้านความละเอียดในการจับภาพ สถานการณ์ทั่วไปเกิดขึ้นกับกล้องเว็บเช่น Logitech QuickCam IM ซึ่งรองรับหลายความละเอียด แต่ตั้งค่าเริ่มต้นที่ความละเอียดต่ำทำให้การจับภาพที่มีคุณภาพสูงเป็นไปได้ยาก หากคุณเคยพบว่ามีปัญหาในการปรับความละเอียดของกล้องของคุณให้สูงกว่า 320x240 คุณไม่ใช่คนเดียว มาสำรวจวิธีแก้ปัญหานี้กันเถอะ!
ความท้าทาย
คุณอาจมีการตั้งค่าที่กล้องเว็บของคุณรองรับความละเอียดเช่น 640x480 และ 1280x960 อย่างไรก็ตาม การพยายามปรับสิ่งนี้ในโปรแกรม OpenCV ภาษา C/C++ ของคุณอาจยังคงเป็นเรื่องที่ล้มเหลว โดยจะถ่ายภาพในความละเอียดเริ่มต้น 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
ถัดไป คุณต้องสร้างฟังก์ชันใหม่ชื่อ 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);
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 อาจเป็นอุปสรรคทางเทคนิค แต่ด้วยการปรับเปลี่ยนที่เหมาะสม มันก็สามารถทำให้เกิดขึ้นได้ โดยการใช้วิธีการที่อธิบายไว้ คุณสามารถปลดล็อคการถ่ายภาพที่มีคุณภาพสูงจากกล้องเว็บของคุณ เพิ่มประสิทธิภาพให้กับโปรเจกต์ที่พึ่งพาความสามารถนี้อย่างสำคัญ อย่าให้การตั้งค่าเริ่มต้นยับยั้งคุณ—ควบคุมศักยภาพของกล้องเว็บของคุณได้เลย!