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上进行创作.当然出于各种目的,我们可能想将简书的文章同步到其他网站. 这个时候你会发现所有的文章里面的图片都无法正常显示了. 原因 如果 ...
随机推荐
- Linux,以逗号为分隔符,打印文件file.txt中的第一个和第三个字符
https://zhidao.baidu.com/question/1883257355267391828.html
- JS实现限行
一.JS代码实现 1. 机动车辆限行如下图所示: 具体详情请访问:http://www.bjjtgl.gov.cn/zhuanti/10weihao/index.html 2.JS代码实现 <! ...
- java基础 6 基本类型与运算
1 包装类型 Integer的缓存池为 -128 - 127: 八个基本类型 占bit 与字节 8 bit = 1 字节 boolean 1 byte 8 char ...
- 【面试 spring】【第七篇】spring的问题
1.spring你熟悉么?两大特色 spring 主要有IOC和AOP两大特色. =========================================================== ...
- Go -- RPC 之 Thrift
Thrift 简介: Thrift 是一款高性能.开源的 RPC 框架,产自 Facebook 后贡献给了 Apache,Thrift 囊括了整个 RPC 的上下游体系,自带序列化编译工具,因为 Th ...
- 辅助方法 @Html.Raw与 HtmlString区别
//Html.Raw其实是调用 new Microsoft.AspNetCore.Html.HtmlString(xxx) @{ ViewData["Title"] = " ...
- BeagleBone Black Industrial 杂谈
前言 原创文章,转载引用务必注明链接.水平有限一己拙见,欢迎指正. 本文使用markdown写成,为获得更好的阅读体验,推荐访问我的博客原文: 初版BeagleBone Black(Rev A4) ...
- shell mysql 直接创建表
shell 直接创建表 #!/bin/bash mysql -hdatabases -uroot -p^xxxxasdasdadd <<EOF Create Database If Not ...
- C# - CLR
The Common Language Runtime (CLR), the virtual-machine component of Microsoft's .NET framework, m ...
- 封装算法: 模板方法(Template Method)模式
template method(模板方法)模式是一种行为型设计模式.它在一个方法中定义了算法的骨架(这种方法被称为template method.模板方法),并将算法的详细步骤放到子类中去实现.tem ...