本文档展示了如何将一个OpenCV窗口嵌入MFC对话框,并使用MFC控件将OpenCV窗口居中显示。

以下是一个实现该功能的示例代码:

  1. 使用Visual Studio创建一个基于MFC对话框的应用程序。
  2. 将必要的OpenCV库和头文件添加到您的项目中。
  3. 在您的对话框资源中添加一个图片控件(IDC_PIC),用于显示OpenCV窗口。
  4. 在您的对话框类头文件中,添加以下成员变量:
    cv::Mat frame; // 要显示的图像
    cv::VideoCapture capture; // 视频捕获对象
    
  5. 在您的对话框类实现文件中,将以下代码添加到您的OnInitDialog函数(在return语句之前)以初始化OpenCV并将窗口显示在图片控件中:
    // 设置OpenCV窗口
    cv::namedWindow('OpenCV Window');
    
    // 获取OpenCV窗口的句柄
    HWND hWnd = (HWND)cvGetWindowHandle('OpenCV Window');
    
    // 将OpenCV窗口的父窗口设置为图片控件
    ::SetParent(hWnd, GetDlgItem(IDC_PIC)->m_hWnd);
    
    // 调整OpenCV窗口大小以适合图片控件
    CRect rect;
    GetDlgItem(IDC_PIC)->GetClientRect(&rect);
    ::SetWindowPos(hWnd, NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER);
    
    // 开始从默认摄像头捕获视频
    capture.open(0);
    
    // 检查摄像头是否已成功打开
    if (!capture.isOpened())
    {
        AfxMessageBox("Failed to open camera.");
        return TRUE; // 关闭对话框
    }
    
    // 启动计时器以更新OpenCV窗口
    SetTimer(1, 33, NULL); // 33毫秒 = ~30帧/秒
    
    return TRUE;
    
  6. 将一个WM_TIMER消息处理程序添加到您的对话框类实现文件中以使用捕获的帧更新OpenCV窗口:
    void CYourDialogClass::OnTimer(UINT_PTR nIDEvent)
    {
        if (nIDEvent == 1)
        {
            // 从摄像头捕获一帧
            capture.read(frame);
    
            // 检查帧是否为空
            if (frame.empty())
            {
                AfxMessageBox("Failed to capture frame.");
                return;
            }
    
            // 将帧转换为RGB格式
            cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);
    
            // 在OpenCV窗口中显示帧
            cv::imshow('OpenCV Window', frame);
            cv::waitKey(1);
        }
    
        CDialogEx::OnTimer(nIDEvent);
    }
    
  7. 在您的对话框类实现文件中,将以下代码添加到您的OnClose函数中以释放视频捕获对象并关闭OpenCV窗口:
    void CYourDialogClass::OnClose()
    {
        // 停止捕获视频并释放视频捕获对象
        capture.release();
    
        // 关闭OpenCV窗口
        cv::destroyWindow('OpenCV Window');
    
        CDialogEx::OnClose();
    }
    
  8. 构建并运行您的应用程序。

现在,OpenCV窗口将居中显示在MFC对话框上的图片控件内,并且捕获的帧将在该窗口中显示。

将OpenCV窗口嵌入MFC对话框并居中显示

原文地址: https://www.cveoy.top/t/topic/0D6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录