1、引言

MFC 是一个在 Windows 平台上编写 C++ 应用程序的库,提供了丰富的用户界面功能。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,包含了丰富的图像处理和计算机视觉功能。本文将向大家展示如何将这两个库结合起来,实现一个实时显示摄像头画面的简单应用程序。

2、创建MFC对话框程序

在 Visual Studio 中,我们首先需要创建一个新的 MFC 对话框程序。然后在资源视图中修改对话框属性,为摄像头画面预留一个静态控件。在本示例中,我们将其更名为 "IDC_VIDEO"

3、集成 OpenCV

为了使用 OpenCV,我们需要将其添加到项目中。请确保已经安装并配置好 OpenCV 4.5.1。在解决方案资源管理器中,我们创建了一个名为 "CameraController.h" 的头文件,其中定义了一个负责控制摄像头的类。类的实现位于 "CameraController.cpp" 文件中。

#pragma once
#include <opencv2/opencv.hpp>

class CameraController
{
public:
    CameraController();
    ~CameraController();

    void OpenCamera(int cameraIndex = 0);
    void CloseCamera();
    cv::Mat GetFrame();

private:
    cv::VideoCapture m_capture;
};

#include "pch.h"
#include "CameraController.h"

CameraController::CameraController()
{
}

CameraController::~CameraController()
{
    CloseCamera();
}

void CameraController::OpenCamera(int cameraIndex)
{
    m_capture.open(cameraIndex);
}

void CameraController::CloseCamera()
{
    if (m_capture.isOpened())
    {
        m_capture.release();
    }
}

cv::Mat CameraController::GetFrame()
{
    cv::Mat frame;
    m_capture.read(frame);
    return frame;
}

4、修改 MFC 程序

为了在 MFC 程序中集成 OpenCV 功能,我们需要对 "MyMFCAppDlg.cpp" 文件进行修改。首先,在文件顶部添加必要的 include 语句,然后在 "CMyMFCAppDlg" 类中添加一个 "CameraController" 对象。接下来,我们需要修改 "CMyMFCAppDlg::OnInitDialog()" 函数以打开摄像头。

private:
    CameraController m_cameraController;

m_cameraController.OpenCamera();

5、实时显示摄像头画面

为了实时更新摄像头画面,我们创建了一个定时器,并在 "CMyMFCAppDlg::OnTimer()" 函数中处理定时器消息。在该函数中,我们通过 "CameraController" 对象获取摄像头帧,并将其转换为 MFC 可以显示的格式(CImage 对象)。最后,我们将帧绘制到对话框上的静态控件中。

void CMyMFCAppDlg::ShowCameraFrame() //显示
{
    if (!m_cameraController.GetFrame().empty())
    {
        cv::Mat frame = m_cameraController.GetFrame();
        cv::Mat resizedFrame;

        CStatic* pWnd = (CStatic*)GetDlgItem(IDC_VIDEO);
        CRect rect;
        pWnd->GetClientRect(&rect);

        cv::resize(frame, resizedFrame, cv::Size(rect.Width(), rect.Height()));

        // Convert color space from BGR to RGB
        cv::cvtColor(resizedFrame, resizedFrame, cv::COLOR_BGR2RGB);

        // Create a CImage object to store the OpenCV frame
        CImage image;
        image.Create(resizedFrame.cols, resizedFrame.rows, 24);

        // Copy the frame data to the CImage object
        memcpy(image.GetBits(), resizedFrame.data, resizedFrame.cols *resizedFrame.rows * image.GetPitch());

        // Draw the image on the dialog
        CDC* pDC = pWnd->GetDC();
        image.BitBlt(pDC->m_hDC, 0, 0);
        ReleaseDC(pDC);
    }
}

SetTimer(1, 30, NULL); // 30ms interval

void CMyMFCAppDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    if (nIDEvent == 1)
    {
        ShowCameraFrame();
    }

    CDialogEx::OnTimer(nIDEvent);
}

6、结论

通过结合 MFC 和 OpenCV,我们成功实现了一个实时显示摄像头画面的简单应用程序。本文详细介绍了如何创建 MFC 对话框程序,集成 OpenCV 库,以及如何打开摄像头并实时显示视频。这只是 MFC 和 OpenCV 潜力的冰山一角,希望本文能为您在实际项目中集成 MFC 和 OpenCV 提供帮助。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐