Opencv (Opencv2)结合MFC学习数字图像处理【2】图片解码

【如何打开图片解码】
 1. 在CImageProcessDoc类中定义图像数据

1 #include "highgui/highgui.hpp"
2 #include "core/core.hpp"
3 using namespace cv;
4 ......
5 Mat src_image;

 2. 重写 CImageProcessDoc类的OnOpenDocument函数。 

   这个虚函数在你打开一个文件时会被调用,所以这个地方是利用Opencv解码图片的绝佳场所。
 1 BOOL CImageProcessDoc::OnOpenDocument(LPCTSTR lpszPathName)
 2 {
 3     if (!CDocument::OnOpenDocument(lpszPathName))
 4         return FALSE;
 5 
 6     // TODO:  Add your specialized creation code here
 7 
 8 
 9     return TRUE;
10 }

然后呢,我们使用opencv的imread函数来解码图片,lpszPathName 就是图片的绝对路径,不过这里有一个问题,我们的工程默认是开了unicode宏,所以lpszPathName指向的字符是宽字符,而imread的参数是std::string,是ansi字符,所以需要做一个宽字符字符串到ansi字符串的一个转化,为此我们封装了一个函数CString2Stdstring
1 string CommonUtility::CString2StdString(const CString& cstr)
2 {
3     CT2A str(cstr);
4     return string(str.m_psz);
5 }
这个功能和图像处理没啥关系,也不需要深入了解其中的原理(字符串编码的原理不在此文讨论范围之内),不过在google上查CString到string的这个转化,基本上中文的前几页的文章没几个靠谱了,最后还是在stackoverflow上找到了答案

http://stackoverflow.com/questions/859304/convert-cstring-to-const-char

3. 利用opencv解码图像 
在CImageProcessDoc类的OnOpenDocument函数中加入如下代码,

1 string str = CommonUtility::CString2StdString(lpszPathName);
2 TRACE("%s\n",str.c_str());
3 
4 src_image = imread(str);
5 TRACE("%d height:%d\n",src_image.cols,src_image.rows);

其中TRACE用来在Output窗口打印一些信息,这个在调试时才能看到,为了验证图片解码是否正常,我们把输入图片的长宽打印了出来,如下图:

                                                        

可见该图片的长为1024个像素,宽为768个像素,虽然没有看到这只考拉,但是说明我们的mfc框架和opencv库结合运行得还算不错,这是之后我们开发的基础。关于如何显示图片,我想了想,这个topic其实也不算太naive,涉及到一些图像方面和windows编程方面的知识,所以留待下一篇再细说。

原文地址:https://www.cnblogs.com/speedmancs/p/2674298.html