将OpenCV窗口嵌入MFC对话框并居中显示
本文档展示了如何将一个OpenCV窗口嵌入MFC对话框,并使用MFC控件将OpenCV窗口居中显示。
以下是一个实现该功能的示例代码:
- 使用Visual Studio创建一个基于MFC对话框的应用程序。
- 将必要的OpenCV库和头文件添加到您的项目中。
- 在您的对话框资源中添加一个图片控件(IDC_PIC),用于显示OpenCV窗口。
- 在您的对话框类头文件中,添加以下成员变量:
cv::Mat frame; // 要显示的图像 cv::VideoCapture capture; // 视频捕获对象 - 在您的对话框类实现文件中,将以下代码添加到您的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; - 将一个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); } - 在您的对话框类实现文件中,将以下代码添加到您的OnClose函数中以释放视频捕获对象并关闭OpenCV窗口:
void CYourDialogClass::OnClose() { // 停止捕获视频并释放视频捕获对象 capture.release(); // 关闭OpenCV窗口 cv::destroyWindow('OpenCV Window'); CDialogEx::OnClose(); } - 构建并运行您的应用程序。
现在,OpenCV窗口将居中显示在MFC对话框上的图片控件内,并且捕获的帧将在该窗口中显示。
原文地址: https://www.cveoy.top/t/topic/0D6 著作权归作者所有。请勿转载和采集!