MFC显示Mat图片
Opencv在1.0时代,在MFC框架上显示图片可以通过Cvvimage类里的DrawPicToHDC(
IplImage *img, UINT ID)方法方便的显示出来,当然当时使用的还是IpIImage图片格式,到了Opencv2.0,不知道基于什么考虑,Cvvimage类被舍弃了,也行是OpenCV小组各位大神觉得MFC命不久矣?……不得而知。
这就导致在MFC上显示图片的这个小小的需求变的复杂起来:首先我们需要将1.0版本的CvvImage.h和CvvImage.cpp
放入我们的程序目录,再把Mat经过格式处理后转为IpIImage,最后才能使用DraPicToDC方法传递图像给Picture
Control控件,显示完之后,还需要再由IpIImage转回Mat后续处理……
幸运的是,办法总比困难多,各种剑走偏锋的大牛散落在网络的各个角落里,等待我们去发现,最近看到知乎网友jie
wu”对这一问题不走寻常路的解决办法,贴出来瞻仰一二:
namedWindow("view", WINDOW_AUTOSIZE);
HWND hWnd = (HWND) cvGetWindowHandle("view");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_STATIC_CV)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
链接在此:点击打开链接
方法很简单,但是思路很讨巧,这个方法不是考虑如何添加图片到MFC中,而是把Opencv的窗口添加到MFC中,这样我们对窗口中图像的操作就原原本本呈现在MFC中了。
先来看一下运行效果图:
以下是Key code:
1. 在OnInitDialog初始化函数里添加代码
namedWindow("view",WINDOW_AUTOSIZE);
HWND hWnd = (HWND) cvGetWindowHandle("view");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_STATIC_Pic)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);
其中IDC_STATIC_Pic是Picture Control图形控件的ID;
2. 定义打开图片按钮事件
CString picPath; //定义图片路径变量
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
NULL, this); //选择文件对话框
if(dlg.DoModal() == IDOK)
{
picPath= dlg.GetPathName(); //获取图片路径
}
//CString to string 使用这个方法记得字符集选用“使用多字节字符”,不然会报错
string picpath=picPath.GetBuffer(0);
Mat image=imread(picpath);
Mat imagedst;
//以下操作获取图形控件尺寸并以此改变图片尺寸
CRect rect;
GetDlgItem(IDC_STATIC_Pic)->GetClientRect(&rect);
Rect dst(rect.left,rect.top,rect.right,rect.bottom);
resize(image,imagedst,cv::Size(rect.Width(),rect.Height()));
imshow("view",imagedst);
适应图形控件的显示效果:
注: Picture Control控件类型不需要必须是矩形(Rectangle),使用默认的类型帧(Frame)也可以正常显示。
MFC显示Mat图片的更多相关文章
- mfc显示静态图片最简单的方法
一致都是研究如何调用opencv显示动态图片,但是很多时候在显示图标的时候,都是需要显示静态图片,现在将最简单的方法总结下: 1.添加picture控件 2.添加资源,要求为bmp 3.修改属性 结果 ...
- MFC 显示CImg图片
很多示例关于CImg都是基于控制台的,如何把它用于MFC中显示. Problem:直接按照控制台示例写入MFC程序中,当程序执行完display后,其后面的代码便不再执行. solution:开辟新的 ...
- 在mfc中picture控件中显示Mat图片<转>
void ShowMatImgToWnd(CWnd* pWnd, cv::Mat img) { if(img.empty()) return; CRect drect; pWnd->GetCli ...
- MFC显示bmp图像
有了bmp文件读写的基础,我们就能够開始用MFC显示BMP图片了. 在这里,事实上微软为我们提供了一个实现bmp文件显示的框架,名叫diblook,我们能够先下载下来看看. 以下上链接:DIBLOOK ...
- MFC&Halcon之图片显示
上一篇介绍了MFC调用Halcon功能的简单例子,在这个例子中,点击按钮会弹出一个窗口显示图片,但是这样显示并不美观,而且...于是我决定把显示窗口做在MFC的窗体内部. 具体的方案是:使用一个Pic ...
- MFC对话框显示BMP图片
1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...
- MFC显示GIF动画图片
本帖则将讨论如何在MFC的对话框里显示GIF动画图片.一些关于传统控件的美化方法正在研究当中会陆续发帖的. 这是本帖用到的一个VS2008例程. 附件 GifPicture.rar (138.1 ...
- 嵌入式linux------SDL移植(am335x下显示bmp图片)
#include<stdio.h> #include "/usr/local/ffmpeg_arm/include/SDL/SDL.h" char *bmp_name[ ...
- 关于如何显示Jianshu图片的方案
问题的提出 简书是一个很好的博客网站,很多朋友都在jianshu上进行创作.当然出于各种目的,我们可能想将简书的文章同步到其他网站. 这个时候你会发现所有的文章里面的图片都无法正常显示了. 原因 如果 ...
随机推荐
- hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。
题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有 ...
- 如何查看stm32固件库版本及MDK和keil uvision的关系
一.方法如上图: 本人的keil uvision4.12版本如下,晕倒! * Version : V2.0.1* Date : 06/13/2008 二.keil MDK和keil uvision的关 ...
- stm32f103定时器
1)TIM_TimeBaseInitTypeDef 时基初始化结构体,它包括了四个成员函数:TIM_ClockDivision.TIM_CounterMode.TIM_Period.TIM_Presc ...
- Centos7 下的防火墙端口配置
如果外部不能访问,需要查看防火墙以及服务器的端口安全设置. 防火墙的操作 查看所有打开的端口: firewall-cmd --zone=public --list-ports 添加 firewall- ...
- Java并发编程实战 读书笔记(二)
关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...
- 详解 CSS 七种三栏布局技巧
作者:林东洲 链接:https://zhuanlan.zhihu.com/p/25070186 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 三栏布局,顾名思义就是 ...
- MFC 小知识总结三
1 载入资源位图 1 获取程序实例 HINSTANCE m_hInst; m_hInst=AfxGetInstanceHandle(); //获取程 ...
- 自己定义html中a标签的title提示tooltip
自己定义html中a标签的title提示tooltip 简单介绍 用简单的jquery+CSS创建自己定义的a标签title提示,用来取代浏览器默认行为.如图: watermark/2/text/aH ...
- Java学习之集合
1.ArrayList:采用数组的形式保存对象,这种方式将对象保存在连续的位置中,所以查询效率比较高,但是插入删除时麻烦,并且ArrayList不是线程安全的. 2.Vector:保存对象的方式与Ar ...
- mybatis 一对一映射
xml <mapper namespace="com.oracle.dao.one2oneDao"> <sql id="personColum" ...