VS2010 / MFC + OpenCV 2.4.1打开图片

      本人近期才开始学习MFC的相关知识,几乎从零开始。本周遇到了一些棘手问题,在使用VS2010和OpenCV制作一个打开图片的界面时,总是设置不好。从网上找了一些代码,总是因为版本问题无法运行。问题已经解决,现在整理一下思路。主要参考资料:http://jingyan.baidu.com/article/f71d60375ddd411ab641d1e3.html?qq-pf-to=pcqq.c2c

http://blog.csdn.net/fantasy4086/article/details/6668284

         本人在操作过程中的环境如下:

环境:在Windows8 x64,VS2010 / MFC+ OpenCV 2.4.8环境下,

目的:制作一个界面,通过点击按钮可以选择在picture控件中显示相应的图片。

 

        出现的问题:在参考其他网络资料时,发现许多代码中使用了CvvImage这个类,但是,这个类在OpenCV2.2以后的版本中已经取消了。显示图片到MFC的Picture控件时需要这个类,所以,我们要下载CvvImage.h和CvvImage.cpp文件。

下载地址:http://dl.dbank.com/c04u6b8sxe或者

http://download.csdn.net/detail/connor_lele/4687210#comment

步骤

一、新建项目

       单击菜单栏的文件->新建->项目

            选择Visual C++,MFC应用程序,名称为CSDN_demo,选择好路径,然后单击“确定”


          再单击“下一步”。此时,按照下图来选择各个项。

          选择“基于对话框”、不使用Unicode库,选择“在静态库中使用MFC”,单击“完成”。


           完成后,会出现一个编辑对话框的界面。

二、配置OpenCV环境

               由于本人之前配置过环境,而且过程繁琐,因此,这里就不再重复。详细过程参考:http://blog.csdn.net/liuqinglong110/article/details/30051219

       (当然有些人的做法是:在项目属性中加载lib文件:菜单 项目->属性-> 配置属性-> 链接器–>输入-> 附加依赖库中加入 cxcore200.lib  cv200.lib highgui200.lib这三个库。           然后在 mymfc.h 的 #include "resource.h" 下加入如下代码:#include “cv.h”   #include “highgui.h”。注意:用英文分号隔开。这种方法的有效性,本人并没有亲自验证过。         转自:http://blog.csdn.net/aaahuanian/article/details/8027210

三、添加和设置控件

         在菜单栏中,视图->工具箱,此时就打开了控件的工具箱。选择工具箱中的Button控件,并将其拖到对话框相应的位置。


          右击Button控件,选择属性,将其Caption改为OpenImg。

           添加Picture Control控件到对话框的相应位置,并调整控件的大小。


          右击Picture Control控件,选择属性,打开控件属性对话框,如下图,保持ID属性不变,修改Type属性为Rectangle。

          现在为按钮添加处理程序,右击OpenImg按钮,选择“添加事件处理程序”,此时出现向导界面。消息类型选择BN_CLICKED,类列表选择CCSDN_deomDlg,函数处理             程序名选择OnBnClickedOpenImg,单击“添加编辑”。

四、添加OpenCV旧版本中的CvvImage.h和CvvImage.cpp文件

           如首先添加CvvImage.h,则右击解决资源方案管理器中的“头文件”-> “添加”->” CvvImage.h”


           然后再用类似的方式,在“源文件”的文件夹下添加“CvvImage.cpp”。

          注意:CvvImage.h和CvvImage.cpp这两个文件要和本项目中的其他cpp文件等放在同一个文件夹中。

五、添加代码

         在解决方案管理器中双击打开CSDN_demoDlg.h.

        在#pragma once的下一行添加如下代码:

        #include "cv.h"
        #include "highgui.h"
       #include "CvvImage.h"

注意:若"CvvImage.h"不在工程的包含目录中,则需要写成完整路径,并且“\”要写成“\\”,如:F:\\CvvImage。建议还是放在工程的包含目录中,这样使用相对路径可以避免一些不必要的麻烦。(这三行代码应该)

 

在CSDN_demoDlg.h文件中CSDN_demoDlg类的声明中添加函数DrawPicToHDC()的声明:void DrawPicToHDC(IplImage *img, UINT ID);。

(其实这个函数名DrawPicToHDC()不是固定的,只要函数声明和定义的名称一致就可以了。)

        在CSDN_demoDlg.cpp中添加DrawPicToHDC()的函数定义:

void CCSDN_demoDlg::DrawPicToHDC(IplImage *img, UINT ID)
{
CDC *pDC = GetDlgItem(ID)->GetDC();
HDC hDC= pDC->GetSafeHdc();
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);
CvvImage cimg;
cimg.CopyOf( img ); // 复制图片
cimg.DrawToHDC( hDC, &rect ); //将图片显示到图片控件指定区域内。
ReleaseDC( pDC );
}

在按钮OpenImg的响应函数中添加代码:

void CCSDN_demoDlg::OnBnClickedOpenImg()
{ IplImage *image=NULL; //原始图片
if(image) cvReleaseImage(&image);
CFileDialog dlg(
                   TRUE,_T("*.bmp"), NULL,
                   OFN_FILEMUSTEXIST| OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
                   _T("imagefiles (*.bmp; *.jpg) |*.bmp; *.jpg; *.jpeg | All Files (*.*) |*.*||"),NULL
                   );                                                                                 //选项图片的约定。
         dlg.m_ofn.lpstrTitle= _T("打开图片");  //打开文件对话框的标题吗
         if(dlg.DoModal() != IDOK )                                            //判断是否获得图片
                   return;
         CStringmPath = dlg.GetPathName();                        //获取图片路径
         IplImage*ipl = cvLoadImage( mPath, 1 );       //读取图片、缓存到一个局部变量ipl中
         if(!ipl )                                                                                //判断是否成功读取图片
                   return;
         ShowImage(ipl,IDC_STATIC);                    // 调用显示图片函数
         cvReleaseImage(&ipl );                                                 //释放ipl占用的内存
 }


六、运行






  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值