需求:MFC显示opencv读取的Mat图

代码:

1、中间转化的函数:

//************************************
// 函数名称:    Show2DC
// 访问权限:    public static
// 创建日期:    2016/10/26
// 创 建 人:
// 函数说明:    将Mat数据类型的图像像是在DC指向的窗口上
// 函数参数:    const cv::Mat & img         输入图像数据
// 函数参数:    HDC dst_hdc             输出图像数据
// 函数参数:    const unsigned int dc_heigh     DC所指向窗口的高度
// 函数参数:    const unsigned int dc_width     DC所指向窗口的宽度
// 返 回 值:    BOOL
//************************************
BOOL Cxxx::Show2DC(const cv::Mat& img, HDC dst_hdc, const unsigned int dc_heigh, const unsigned int dc_width, int move_x, int move_y)
{if (!img.data){return FALSE;}CImage dst_img;cv::Mat temp;  //定义中间变量GetFixMat(img, temp, dc_heigh, dc_width);   //图像的几何大小变换ConvertMat2CImage(temp, dst_img);            //图像转换int offsetx = (dc_width - temp.cols) / 2 + move_x;          //调整偏移量int offsety = (dc_heigh - temp.rows) / 2 + move_y;BOOL temp1 = dst_img.Draw(dst_hdc, offsetx, offsety, dst_img.GetWidth(), dst_img.GetHeight());  //图像显示return TRUE;
}//************************************
// 函数名称:    ConvertMat2CImage
// 访问权限:    public
// 创建日期:    2016/10/26
// 创 建 人:
// 函数说明:    将cv::Mat类型的图像数据转换为CImage类型的数据
// 函数参数:    const cv::Mat & src_img 输入的cv::Mat图像数据
// 函数参数:    CImage & dst_img            转换之后的CImage类型
// 返 回 值:    BOOL
//************************************
BOOL Cxxx::ConvertMat2CImage(const cv::Mat& src_img, CImage& dst_img)
{if (!src_img.data){return FALSE;}int width = src_img.cols;            //获取输入图像的宽度int height = src_img.rows;          //获取输入图像的高度int channels = src_img.channels();  //获取输入图像的int src_type = src_img.type();dst_img.Destroy();switch (src_type){case CV_8UC1:{dst_img.Create(width, -1 * height, 8 * channels);unsigned char* dst_data = static_cast<unsigned char*>(dst_img.GetBits());int step_size = dst_img.GetPitch();     //获取位图行与行之间相差的字节数unsigned char* src_data = nullptr;for (int i = 0; i < height; i++){src_data = const_cast<unsigned char*>(src_img.ptr<unsigned char>(i));   //获取行指针for (int j = 0; j < width; j++){if (step_size > 0){*(dst_data + step_size * i + j) = *src_data++;} //像素的排列方式是自左上开始的else{*(dst_data + step_size * i - j) = *src_data++;}}}break;}case CV_8UC3:{dst_img.Create(width, height, 8 * channels);unsigned char* dst_data = static_cast<unsigned char*>(dst_img.GetBits());int step_size = dst_img.GetPitch();     //获取位图行与行之间相差的字节数unsigned char* src_data = nullptr;for (int i = 0; i < height; i++){src_data = const_cast<unsigned char*>(src_img.ptr<unsigned char>(i));   //获取行指针for (int j = 0; j < width; j++){for (int k = 0; k < 3; k++){*(dst_data + step_size * i + j * 3 + k) = src_data[3 * j + k];}}}break;}default:MessageBox("输入的图像类型出错");break;}return TRUE;
}//************************************
// 函数名称:    GetFixMat
// 访问权限:    private
// 创建日期:    2016/10/26
// 创 建 人:
// 函数说明:    将输入图像调整到适合在DC所指向的窗口上显示
// 函数参数:    const cv::Mat & src_img     输入图像
// 函数参数:    cv::Mat & dst_img           输出图像
// 函数参数:    unsigned int dc_heigh       DC所指向窗口的高度
// 函数参数:    unsigned int dc_width       DC所指向窗口的宽度
// 返 回 值:    BOOL
//************************************
BOOL Cxxx::GetFixMat(const cv::Mat& src_img, cv::Mat& dst_img, unsigned int dc_heigh, unsigned int dc_width)
{if (!src_img.data){return FALSE;}unsigned int img_rows(src_img.rows);unsigned int img_cols(src_img.cols);unsigned int fix_heigh(std::min(img_rows, dc_heigh));unsigned int fix_width(std::min(img_cols, dc_width));float ratio_w = static_cast<float>(fix_width) / static_cast<float>(img_cols);float ratio_h = static_cast<float>(fix_heigh) / static_cast<float>(img_rows);float ratio = std::min(ratio_w, ratio_h);int show_width = static_cast<unsigned int>(ratio * img_cols);int show_height = static_cast<unsigned int>(ratio * img_rows);cv::resize(src_img, dst_img, cv::Size(show_width, show_height), (0.0), (0.0), cv::INTER_LINEAR);return TRUE;
}

2、在OnPaint函数中的代码段:

    CRect client;GetClientRect(&client);Show2DC(Img_Show, dc.m_hDC, client.Height(), client.Width(), 0,0);//Img_Show为Mat类型

opencv中的Mat图使用CDC显示相关推荐

  1. OpenCV中图像Mat,二维指针和CxImage类之间的转换

    在做图像处理中,常用的函数接口有Opencv中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  2. OpenCV中图像Mat存储格式和MATLAB中图像Mat存储格式的区别

    首先,看一下图像中的宽高与笛卡尔坐标系之间的关系如下图所示,即x与width(cols)对应,y与height(rows)对应,x是按列来进行变化,y按行变化. OpenCV读入图像以Mat形式存储时 ...

  3. opencv中的美图技巧(祛斑,词云,风格迁移,抠图,插图,修改背景,图片二维码)等着你的女朋友夸你吧

    个人ps 没掌握得怎么好,尝试用程序来完成ps的功能吧. 有斑点怎么办:祛斑. 只有一张城市白天图,像生成黑夜图怎么办,用风格迁移把. 人物抠图就不说啦吧. 没钱带女友旅游世界怎么办,我教你修改你背景 ...

  4. 遍历opencv中的mat像素的几种方法和概念

    今天在看矩形滤波的时候忽然脑子短路,把一些概念全弄混了,现总结一下,以便下次再混的时候可以参考确认下,自己的理解,有错的地方还请指正. 首先,在Opencv2中基本上都是用的Mat来表示图像了,C++ ...

  5. 如何将OpenCV中的Mat类绑定为OpenGL中的纹理

    https://blog.csdn.net/TTTTzTTTT/article/details/53456324 如果要调用外接的USB摄像头获取图像通常使用OpenCV来调用,如何调用摄像头请参考本 ...

  6. C语言使用指针处理opencv中的Mat图像数据

    1.在处理图像时,一般直接使用opencv中的imread函数获取图片,但是获取到图片后没有用到opencv中的其他算法时,直接用图片处理就会出现耗时严重的情况,所以需要将图片形式转换成指针数组形式处 ...

  7. c++版opencv中的Mat数据类型的说明

    一直使用mat,很好用,但是细扣又说不清楚到底是怎样的一种数据类型,今天学习下. 一.先上硬货结论: 浅拷贝:拷贝构造函数和赋值运算符只复制信息头,即实际上还是同个图像数据.mat中存储同个数据地址: ...

  8. 利用FreeImage将gif图像转为opencv中的Mat

    原文:http://www.cnblogs.com/monkeyhey/p/3927857.html 网上有将gif转为iplimg的版本,只是用惯了C++的接口,所以就写了个转Mat的版本,代码比较 ...

  9. opencv中查看mat位图的像素幅度(Cv::matStep)

    实例 其中step里的 ,其中数据指针首地址是p=0x000000000028d7b0,1280是每行数据所占的字节数,1是每个元素的字节数. Mat的作用 The class Mat represe ...

最新文章

  1. splunk 通过rest http导入数据
  2. mysql官网二进制包_mysql二进制包安装与配置实战记录
  3. mybatis学习(3)进阶
  4. spring读取多个配置properties报错“Could not resolve placeholder“的解决方案
  5. Frame buffer分析 - fbmem.c【转】
  6. 商汤物语:全球最大AI独角兽的雄心与优雅
  7. 熟悉VB 6.0界面
  8. matlab 画图 方程,matlab 画图与解方程
  9. NSIS教程(4): 调用Windows API
  10. Android手机功能篇 调用前置摄像头的方法
  11. 2017年的博客之路开始---下一个十年
  12. php datedif,datedif 函数怎么用?
  13. [杂记]就《10.30日华为HR体验官胡玲在心声论坛爆料内部HR腐败行为》有感
  14. 等保安全计算环境之Windows(身份鉴别+访问控制)(二级)
  15. idea 集成python
  16. 计算机专业发展1500字,【关于计算机起源及发展的论文1500字左右,论文形式.】...
  17. centos yum 安装jdk
  18. 垃圾污渍纹理PS笔刷
  19. 面试中国建设银行科技专项人才-广东省省分行
  20. android 3d轮播图,3D轮播图

热门文章

  1. Git 使用方法(一)-本地篇
  2. java 嵌套类implement_有关 C++ 嵌套类
  3. 带瀑布流的电钢琴_《EduOffice数字音乐电钢琴互动教室教学系统》系统特色之六:创...
  4. linux自动点击软件上的按钮有什么用,教会你Linux Shell自动交互的三种方法
  5. android自动创建快捷方式,Android开发之生成桌面快捷方式细则(原创)
  6. java 输出一个爱心_java基础 之 几个常用的类
  7. mysql主从备份 ssl_基于SSL的mysql主从复制
  8. android create命令,phonegap运行android – create命令失败,退出代码8 – linux
  9. df 命令查看磁盘空间_Linux df命令检查磁盘空间
  10. 霍夫曼算法_霍夫曼编码算法