关于MFC中显示OpenCV Mat矩阵中的图像(一种新的解决方法)

来源:互联网 发布:企业网络整改方案 编辑:程序博客网 时间:2024/05/16 01:49
 

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*/

 

原创粉丝点击