当前位置: 首页 > news >正文

如何利用 OpenCV 将图像显示在对话框窗口上

在基于 MFC(Microsoft Foundation Classes)开发的桌面应用中,经常需要实现图像加载、处理与界面显示的功能。结合 OpenCV 库强大的图像处理能力,我们可以快速实现 “将图像显示在 MFC 对话框的 Picture 控件上” 这一需求。

本文将基于完整可运行的工程代码,详细讲解实现原理、关键步骤与代码解析,帮助开发者快速掌握 MFC+OpenCV 联合显示图像的方法。

OpenCV 将图像显示在对话框窗口上意义是什么?

把 OpenCV 处理后的图像,显示在标准对话框 / 窗口上,就是为了:可视化、调试、交互、做正式软件界面。

  1. 实时看处理结果图像滤波、边缘检测、人脸检测、目标跟踪…… 处理完必须立刻看到效果,否则不知道代码对不对。
  2. 方便调试程序窗口能显示中间结果,帮你快速定位哪里出错。
  3. 提供用户交互可以在窗口上点击、拖动、框选、按键控制,让程序 “能用”,而不是只能跑后台。
  4. 做成正式软件界面不只是命令行工具,而是带窗口、带按钮、带图像显示的桌面软件

一、功能概述

本案例实现目标:

  1. 创建 MFC 对话框应用程序;
  2. 添加按钮与 Picture 控件;
  3. 点击按钮打开文件选择对话框,选择本地图像;
  4. 使用 OpenCV 加载图像,并嵌入显示到 MFC 的 Picture 控件中
  5. 自动缩放图像以适配控件大小,保持界面整洁。

开发环境:MFC、OpenCV、C++

二、界面设计准备

在开始编码前,先完成对话框界面布局:

  1. 向工程中添加一个按钮(Button),ID 设为IDC_BUTTON_LOADIMAGE,标题为 “加载图像”;
  2. 添加一个Picture 控件,ID 设为IDC_SHOW_PICTRUE,用于显示 OpenCV 处理后的图像;
  3. 保留 MFC 默认的对话框框架,无需额外修改样式。

三、头文件与命名空间配置

要在 MFC 中使用 OpenCV,必须引入对应的头文件并声明命名空间:

#include "stdafx.h" #include "OpencvImage.h" #include "OpencvImageDlg.h" #include "afxdialogex.h" // OpenCV 核心头文件 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv; // 使用OpenCV命名空间

说明:

  • core.hpp:OpenCV 核心数据结构(如 Mat);
  • highgui.hpp:图像读取、窗口显示;
  • imgproc.hpp:图像缩放、变换等处理函数。

四、关键变量定义

在对话框类中,定义 Picture 控件的绑定变量:

CStatic m_ctrlPic; // 绑定 IDC_SHOW_PICTRUE 图片控件

通过DoDataExchange完成控件与变量的关联:

void COpencvImageDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_SHOW_PICTRUE, m_ctrlPic); }

五、核心功能实现:图像加载与显示

图像显示的核心逻辑在按钮点击响应函数中实现,完整代码如下:

void COpencvImageDlg::OnBnClickedButtonLoadimage() { CString pathName; BOOL isOpen = TRUE; //是否打开(TRUE为打开对话框,FALSE为保存对话框) CString defaultDir = ""; //默认打开的文件路径 CString filter = "所有类型(*.*)|*.*"; //文件过虑的类型 CFileDialog openFileDlg(isOpen, NULL, defaultDir + "\\", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter, NULL); if(openFileDlg.DoModal() == IDOK) { //得到完整的文件名 pathName = openFileDlg.GetPathName(); //获取界面上picture的控件大小 CRect rc; m_ctrlPic.GetClientRect(&rc); cv::Size resize; resize.height = rc.bottom - rc.top; resize.width = rc.right - rc.left; cv::Mat src , resizedst; //读取图片 src = cv::imread((LPCTSTR)pathName); //缩放 cv::resize(src, resizedst, resize); //在导入新的图像文件时先进行清空旧的窗口内容 cv::destroyAllWindows(); //创建窗口 cv::namedWindow("OpecvImage", CV_WINDOW_AUTOSIZE); //窗口句柄 HWND ImgWnd = static_cast<HWND>(cvGetWindowHandle("OpecvImage")); //父窗口句柄 HWND hParent = ::GetParent(ImgWnd); //设置图片显示的句柄 ::SetParent(ImgWnd, m_ctrlPic.m_hWnd); //隐藏 ::ShowWindow(hParent, HIDE_WINDOW); //对图像进行显示 cv::imshow("OpecvImage", resizedst); } UpdateData(FALSE); }

六、代码核心原理讲解

1. 文件选择对话框

使用 MFC 的CFileDialog实现图像文件选择,支持所有格式的图片文件筛选,用户可自由选择本地图像。

2. 自适应控件缩放

通过GetClientRect获取 Picture 控件的宽高,调用cv::resize将图像缩放到与控件完全匹配的尺寸,避免图像溢出或变形

3. OpenCV 窗口嵌入 MFC(核心技术)

这是本案例最关键的步骤:

  • OpenCV 默认创建独立窗口显示图像;
  • 通过cvGetWindowHandle获取 OpenCV 窗口句柄;
  • 使用::SetParent将 OpenCV 窗口的父窗口设置为 MFC Picture 控件
  • 隐藏 OpenCV 原生窗口,只保留嵌入后的显示区域。

最终实现效果:图像完全显示在 MFC 对话框的指定控件内,而非独立弹出窗口。

//包含目录
g:\opencv\build\include
g:\opencv\build\include\opencv2
g:\opencv\build\include\opencv

//库目录
g:\opencv\build\x86\vc10\lib

//链接输入
//debug库文件列表
opencv_ml2410d.lib
opencv_calib3d2410d.lib
opencv_contrib2410d.lib
opencv_core2410d.lib
opencv_features2d2410d.lib
opencv_flann2410d.lib
opencv_gpu2410d.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
opencv_legacy2410d.lib
opencv_objdetect2410d.lib
opencv_ts2410d.lib
opencv_video2410d.lib
opencv_nonfree2410d.lib
opencv_ocl2410d.lib
opencv_photo2410d.lib
opencv_stitching2410d.lib
opencv_superres2410d.lib
opencv_videostab2410d.lib

测试图片运行效果:

《如何利用 OpenCV 将图像显示在对话框窗口上》 源码下载链接如下:

利用OpenCV将图像显示在对话框窗口上资源-CSDN下载

http://www.rkmt.cn/news/1499454.html

相关文章:

  • 2026合肥市生成式引擎优化(GEO)技术能力权威测评报告|百分制量化技术版 - 安徽工业
  • 2026 成都爱马仕香奈儿回收指南,热门经典款行情与估价细节解析 - 奢侈品回收评测
  • 鸿蒙原生应用实战(三):笔记详情与编辑页面的路由与CRUD
  • 南宁黄金回收全攻略:精选正规门店,教你安全高价变现 - 奢侈品回收评测
  • 华三无线认证实战:绿洲平台对接中的苹果/安卓手机优化与微信白名单配置详解
  • 仙人掌-圆方树学习笔记
  • 2026年粉末包装机厂家排行:全国优质品牌推荐与详细使用攻略 - 品研笔录
  • 用安信可ESP32S3开发板做个无线监控:手把手教你驱动USB摄像头并实现Wi-Fi图传
  • MCP(Model Context Protocol)详细介绍
  • 广州市顺风搬家服务有限公司车辆类型有哪些?载重、尺寸、适用场景完整对比 - 生活服务
  • [charger][sc7061]配置
  • 用 Vim 以只读模式打开文件的几种方式
  • 高性能计算中的输出重定向:Bash与SLURM的协同工作
  • 道里正规商家榜单,收的顶领跑区域黄金回收行业 - 奢侈品回收测评
  • 哈尔滨道里高价回收店铺TOP榜,2026黄金回收收的顶稳居榜首梯队 - 奢侈品回收测评
  • 宁波石材加工厂怎么选?本地源头工厂7个筛选标准(2026版) - 宁波融诚石业
  • 别再只盯着TPM了!从国产TPCM实战出发,聊聊可信启动的静态度量与动态度量到底怎么玩
  • 用CppAD+IPOPT搞定一个简单的非线性优化问题:从数学公式到C++代码的完整流程
  • 通关‘头歌’线性回归后,我总结了5个NumPy实战技巧与1个常见坑
  • 后端技术栈深度解析:从入门到精通的完整指南
  • 2026年 浙江宣传册设计公司最新推荐榜单:品牌画册、企业宣传册与产品手册设计服务及创意案例精选 - 品牌发掘
  • 皮质磨损 / 五金划痕 / 污渍:福州包包回收成色分级与扣损标准 - 奢侈品回收评测
  • 给老盒子续命:魔百盒CM301H刷入当贝影视桌面后,我实现了哪些自由?
  • 特氟龙高温胶带评价好的品牌是哪些 - 品牌推荐大师
  • 2026年 奥迪维修/奥迪专修/奥迪保养/奥迪烧机油免拆治理/奥迪底盘异响维修/奥迪发动机维修/奥迪原厂升级改装权威推荐榜单 - 品牌发掘
  • 2026苏州外墙漏水维修市场全景分析与苏州鼎壹万防水补漏公司等三家服务商适配推荐 专业防水公司排名推荐(2026年6月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 魔百盒CM301H刷机后还能做什么?解锁当贝桌面后的5个高阶玩法与优化设置
  • S32K3内存错误处理全解析:从ERM报告到FCCU收集的完整链路
  • 哈尔滨黄金回收攻略,看懂黄金回收计价规则再出手 - 奢侈品回收测评
  • 厦门卖宝玑朗格必看:2026 行情 + 3 大回收套路拆解 - 奢侈品回收评测