การเพิ่มความละเอียดการจับภาพจากกล้องใน 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 อาจเป็นอุปสรรคทางเทคนิค แต่ด้วยการปรับเปลี่ยนที่เหมาะสม มันก็สามารถทำให้เกิดขึ้นได้ โดยการใช้วิธีการที่อธิบายไว้ คุณสามารถปลดล็อคการถ่ายภาพที่มีคุณภาพสูงจากกล้องเว็บของคุณ เพิ่มประสิทธิภาพให้กับโปรเจกต์ที่พึ่งพาความสามารถนี้อย่างสำคัญ อย่าให้การตั้งค่าเริ่มต้นยับยั้งคุณ—ควบคุมศักยภาพของกล้องเว็บของคุณได้เลย!