关于MFC中显示OpenCV Mat矩阵中的图像(一种新的解决方法)
OpenCV的C++类Mat读取的图像在MFC中如何显示目前网络上资料较少,大部分的博文作者都在使用C API。界面上毕竟用C还是没有C++方便,尤其是像我这样的菜鸟。。。。,几经周折,我终于把图片显示在了MFC的视图上,正洋洋得意呢。。。,当我打开下面这幅图像的时候就懵了。
据说,BMP的行的宽度所占字节数必须是四的倍数,
还好后来我在网上搜到了一个在C上实现缩放的代码,它在完成缩放的同时也把图像校正过来了。我顺着这个思路在后面的应用中也成功了,前几天我无意打开一张Windows上的截图,却发现问题还在。
今天得空回来修改这一份代码的时候 ,我发现Mat的at函数结合VecNb这个数据结构的确很好用,只要知道图像的通道数目再根据通道的数目设置N的值,这样就可以完整显示读入的图像。具体来说:
1 图像要按原来的形式读入,即imread 的flag要设置为-1 ;
2 创建的缓存矩阵要与原矩阵的type一样即:CV_(M)U/SC(N),M和N要一致;
3 at<Vec(N)b>中N要和上面的N一致;
Mat tmp(dstHeight,dstWidth,CV_8UC3);
for(i = 0; i<dstHeight; i++)
{
for(j = 0; j<dstWidth; j++)
{
/*srcX = int(i*(float)m_cvImg.cols/(float)dstWidth);
srcY = int(j*(float)m_cvImg.rows/(float)dstHeight);
src_s = cvGet2D(&m_cvImg,srcX,srcY);
dst_s = cvGet2D(&tmp,i,j);
dst_s.val[0] = src_s.val[0];
dst_s.val[1] = src_s.val[1];
dst_s.val[2] = src_s.val[2];
cvSet2D(&tmp,i,j,dst_s);*/
srcX = int(j*(float)m_cvImg.cols/(float)dstWidth);
srcY = int(i*(float)m_cvImg.rows/(float)dstHeight);
tmp.at<cv::Vec3b>(i,j)[0] = m_cvImg.at<cv::Vec3b>(srcY,srcX)[0];
tmp.at<cv::Vec3b>(i,j)[1] = m_cvImg.at<cv::Vec3b>(srcY,srcX)[1];
tmp.at<cv::Vec3b>(i,j)[2] = m_cvImg.at<cv::Vec3b>(srcY,srcX)[2];
}/*for_j*/
}/*for_i*/