通过图像对话框导入图像的时候存在一个问题,就是图像路径的类型转换问题,因为在MFC中的文件路径的格式是CString类型的,而我们利用OpenCV打开图像的路径是string类型,所以就需要转换,在这期间试了很多方法,包括一开始用强制类型转换都发现有错误,到后来发现是编码问题,一个是现在的Unicode,一个是多字节,但是把项目设置成多字节编译不通过,所以放弃这种方法,还是要在Unicode下把类型转换过来。
在MFC中对于UNICODE的编码属性CString被定义为CStringW,其内部是WCHAR宽字符;
对于多字节的编码属性,CSTring被定义为CStringA,其内部是char单字节字符。在网上找了一些资料如下:
//注意!CA2T与CT2A是与编码方式有关的宏定义
cstring=CA2T(stdString.c_str());//std::string->CString
stdString=CT2A((LPCTSTR)cstring);//CString->std::strin
cstingA=stdString.c_str();//std::string->CStringA
stdString=(LPCSTR)cstringA;//CStringA->std::string
cstringA=CW2A(stdWString.c_str());//std::wstring->CStringA
stdWString=CA2W((LPCSTR)cstringA);//CStringA->std::wstring
cstringW=CA2W(stdString.c_str());//std::string->CStringW
stdString=CW2A((LPCWSTR)cstringW);//CStringW->std::string
cstringW=stdString.c_str();//std::string->CStringW
stdWString=(LPCWSTR)cstringW;//CStringW->std::wstring
上面的这些转换与工程的编码格式无关,其中 CStringA 和 std::string , CStringW 和 std::wstring 是相对应的,可以直接提取其内部的字串指针进行转换。而对于内部字符编码不一致的我们通过 CW2A 和 CA2W 进行转换
void CMy_OpencvDlg::OnBnClickedLoadPic()
{
// TODO: 在此添加控件通知处理程序代码.
TCHAR szFilter[] = _T("PNG图片(*.png)|*.png|JPG图片(*.jpg)|*.jpg|所有文件(*.*)|*.*|");
CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, szFilter, this);
CString strFilePath;
if (IDOK == fileDlg.DoModal())
{
strFilePath = fileDlg.GetPathName();
}
/**********************将CString的文件路径转换为string类型的路径*****************/
string pathName = CT2A((LPCTSTR)strFilePath);
/*******************在图像控件中绘图***************************/
m_mat = imread(pathName);
CDC* pDC = GetDlgItem(IDC_PIC)->GetDC();
HDC hDC = pDC->GetSafeHdc();
m_img = m_mat;
CvvImage cimg;
cimg.CopyOf(&m_img);
CRect rect;
GetDlgItem(IDC_PIC)->GetClientRect(&rect);
cimg.DrawToHDC(hDC, &rect);
ReleaseDC(pDC);
}
上面是在MFC中实现的代码,下面是效果图