【如何打开图片解码】
1. 在CImageProcessDoc类中定义图像数据
2. 重写 CImageProcessDoc类的OnOpenDocument函数。
1 #include "highgui/highgui.hpp"
2 #include "core/core.hpp"
3 using namespace cv;
4 ......
5 Mat src_image;
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 }
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 }
2 {
3 CT2A str(cstr);
4 return string(str.m_psz);
5 }
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);
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编程方面的知识,所以留待下一篇再细说。