OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 26482|回复: 31

[原创]MFC下图片控件显示Mat

[复制链接]
发表于 2014-12-20 14:42:55 | 显示全部楼层 |阅读模式
本帖最后由 wawa 于 2016-6-3 20:01 编辑

        cv::Mat显示是opencv编程时不可或缺的一步操作,opencv内就自带了 imshow()这样一个方便的显示函数。但您是否曾经对额外弹出一个窗口感觉不爽,是否在需要查看图片细节的时候,又要重新手动调整mat尺寸再imshow()而感到厌烦。。。
    下面分享一个应用于MFC Picture控件的类,可以实现Mat的加载显示、缩放(滚轮滑动)、拖动(滚轮拖动),应该能给刚开始使用MFC写opencv界面的提供一些便利

本类的使用方法:
1.建立一个picture控件,控件属性中的Notify改成true
2.通过mfc的classwizard来将该picture控件关联并建立一个CStatic类的对象(例m_showing)
3.在控件所在对话框的头文件(例:testDlg.h)中找到刚刚建立的对象(m_showing),并将其类型改为本类CV_picture
4.在控件所在对话框的头文件(testDlg.h)中包含本头文件
5.在控件所在对话框的CCP中(testDlg.ccp)找到OnInitDialog,并在其下的额外初始化代码中加入:
                        m_showImg.OnInit();

注意:建立的工程使用的字符集必须为“多字节字符集”否则字符类型转换中会出错

完成以上配置后,如要显示指定的图片,只需调用ShowImage(cv::Mat &img,int method=0)即可将图片显示在控件上

函数说明:
        //自动调节输入img大小以适应对应图片控件,并将其完整显示出来(本操作包含了cvLoadImage(cv::Mat &img)中的所有操作
        //method缩放的方式:0表示保持图片原比例去适应图片框,1表示拉伸图片去适应图片框
        void ShowImage(cv::Mat &img,int method=0);

         //显示src通过鼠标调整后当前所显示的roi区域内的图像,主要用于刷新画面或高速显示同样规格的图片,不带任何初始化,src的图片规格必须上一次加载的mat完全一致,否则请调用一次ShowImage或cvLoadImage
        void ShowImage_roi(cv::Mat &src,int method=0);


        //每次因窗口绘图刷新图像时的显示图像的缩放方式:0表示保持图片原比例去适应图片框,1表示拉伸图片去适应图片框
        m_iDrawingMethod
      
关于其他使用细节或如需扩展可参考源代码




CV_picture.rar

11.07 KB, 下载次数: 10712

源码

回复

使用道具 举报

发表于 2015-2-17 22:33:03 | 显示全部楼层
我把那个 ShowImage() ;这个函数加到了picture控件里,调用的时候出现这种错误是啥呀C:\Documents and Settings\Administrator\桌面\1.jpg
1.JPG
回复 支持 1 反对 0

使用道具 举报

发表于 2014-12-21 20:32:30 | 显示全部楼层
肿么没有人顶呢

楼主很牛,很给力
回复 支持 反对

使用道具 举报

发表于 2014-12-22 09:44:38 | 显示全部楼层
伟大楼主 ,果断收藏
回复 支持 反对

使用道具 举报

发表于 2014-12-22 11:34:18 | 显示全部楼层
楼主很用心,有想到写这种东西方便大家。
其实我推荐你们去用IMAEWATCH插件。调试的时候能看到所有的Mat,IplImage。还能根据你自己的需要设计相关的类(imagewatch documentation 有介绍),也能在调试的时候显示出来,我自己觉得很好用。具体可以查看OPENCV官网对IMAGEWATCH的简介。但是对VS版本有要求。VS12的UPDATA3以上,或者VS13。好东西都在更高的版本,否则也没必要开发。希望能帮助到大家。
回复 支持 反对

使用道具 举报

发表于 2015-1-14 10:00:48 | 显示全部楼层
人工收藏,回头仔细研究要下。
回复 支持 反对

使用道具 举报

发表于 2015-1-20 10:55:06 | 显示全部楼层
很牛,願意分享,就是可愛。
回复 支持 反对

使用道具 举报

发表于 2015-2-16 23:55:24 | 显示全部楼层
本帖最后由 22881916 于 2015-2-17 19:26 编辑

(⊙o⊙)…
膜拜呀,可是还是没有看懂什么意思,
这个到底怎么用呀
使用的时候出现了如下的错误,不知道怎么解决
----------------------------------
1>zero.obj : error LNK2019: 无法解析的外部符号 "public: virtual __thiscall CV_picture::~CV_picture(void)" (??1CV_picture@@UAE@XZ),该符号在函数 "public: virtual __thiscall CZeroDlg::~CZeroDlg(void)" (??1CZeroDlg@@UAE@XZ) 中被引用
1>zeroDlg.obj : error LNK2001: 无法解析的外部符号 "public: virtual __thiscall CV_picture::~CV_picture(void)" (??1CV_picture@@UAE@XZ)
1>zeroDlg.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall CV_picture::CV_picture(void)" (??0CV_picture@@QAE@XZ),该符号在函数 "public: __thiscall CZeroDlg::CZeroDlg(class CWnd *)" (??0CZeroDlg@@QAE@PAVCWnd@@@Z) 中被引用
1>zeroDlg.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CV_picture::OnInit(void)" (?OnInit@CV_picture@@QAEXXZ),该符号在函数 "protected: virtual int __thiscall CZeroDlg::OnInitDialog(void)" (?OnInitDialog@CZeroDlg@@MAEHXZ) 中被引用
1>.\Debug\zero.exe : fatal error LNK1120: 3 个无法解析的外部命令
1>
1>生成失败。


---------------------------------
已经解决 了,多谢楼主了O(∩_∩)O哈!
回复 支持 反对

使用道具 举报

发表于 2015-2-17 22:15:28 | 显示全部楼层
这个问题虽然解决了,可是还有不明白的地方。
这些函数是应用于picture控件的,但是应该放在哪用呢?
比如那个    void ShowImage(cv::Mat &img,int method=0);
这个函数应该加在哪呢?

直接加在那个picture 控件函数里吗?
我想点击一下按钮,然后再在picture控件里显示,应该怎么办呢
回复 支持 反对

使用道具 举报

发表于 2015-2-17 22:37:59 | 显示全部楼层
本帖最后由 22881916 于 2015-2-17 22:43 编辑

这个我的代码我想用这个 播放网络视频,,,,,好几天了都无解
void CZeroDlg::OnStnClickedvideo()
{
        // TODO: 在此添加控件通知处理程序代码
                CV_picture cvp;
            cv::Mat src;
       CString address = "http://192.168.1.1:8080/?action=stream?dummy=param.mjpg";
        if (!cvp.cvLoadImage(address))
        {
                MessageBox("OPEN FAILED!","VIDEO");
        }
                else {
                        cvp.ShowImage(src,1);
        while (1)
        {
            cvp.ShowImage_roi(src,1);
        }
                }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-5-7 01:35 , Processed in 0.011029 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表