OpenCV的Mat与ATL/MFC的CImage相互转换

2023-11-03 09:48

本文主要是介绍OpenCV的Mat与ATL/MFC的CImage相互转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://blog.csdn.net/liangjialang/article/details/33320093

头文件

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class 你的类名  
  2. {  
  3. public:   
  4.     /*MatToCImage 
  5.     *简介: 
  6.     *   OpenCV的Mat转ATL/MFC的CImage,仅支持单通道灰度或三通道彩色 
  7.     *参数: 
  8.     *   mat:OpenCV的Mat 
  9.     *   cimage:ATL/MFC的CImage 
  10.     */  
  11.     void MatToCImage(Mat& mat, CImage& cimage);  
  12.   
  13.   
  14.     /*CImageToMat 
  15.     *简介: 
  16.     *   ATL/MFC的CImage转OpenCV的Mat,仅支持单通道灰度或三通道彩色 
  17.     *参数: 
  18.     *   cimage:ATL/MFC的CImage 
  19.     *   mat:OpenCV的Mat 
  20.     */  
  21.     void CImageToMat(CImage& cimage, Mat& mat);  
  22. };  

实现文件

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void 你的类名::MatToCImage(Mat& mat, CImage& cimage)  
  2. {  
  3.     if (0 == mat.total())  
  4.     {  
  5.         return;  
  6.     }  
  7.   
  8.   
  9.     int nChannels = mat.channels();  
  10.     if ((1 != nChannels) && (3 != nChannels))  
  11.     {  
  12.         return;  
  13.     }  
  14.     int nWidth    = mat.cols;  
  15.     int nHeight   = mat.rows;  
  16.   
  17.   
  18.     //重建cimage  
  19.     cimage.Destroy();  
  20.     cimage.Create(nWidth, nHeight, 8 * nChannels);  
  21.   
  22.   
  23.     //拷贝数据  
  24.   
  25.   
  26.     uchar* pucRow;                                  //指向数据区的行指针  
  27.     uchar* pucImage = (uchar*)cimage.GetBits();     //指向数据区的指针  
  28.     int nStep = cimage.GetPitch();                  //每行的字节数,注意这个返回值有正有负  
  29.   
  30.   
  31.     if (1 == nChannels)                             //对于单通道的图像需要初始化调色板  
  32.     {  
  33.         RGBQUAD* rgbquadColorTable;  
  34.         int nMaxColors = 256;  
  35.         rgbquadColorTable = new RGBQUAD[nMaxColors];  
  36.         cimage.GetColorTable(0, nMaxColors, rgbquadColorTable);  
  37.         for (int nColor = 0; nColor < nMaxColors; nColor++)  
  38.         {  
  39.             rgbquadColorTable[nColor].rgbBlue = (uchar)nColor;  
  40.             rgbquadColorTable[nColor].rgbGreen = (uchar)nColor;  
  41.             rgbquadColorTable[nColor].rgbRed = (uchar)nColor;  
  42.         }  
  43.         cimage.SetColorTable(0, nMaxColors, rgbquadColorTable);  
  44.         delete []rgbquadColorTable;  
  45.     }  
  46.   
  47.   
  48.     for (int nRow = 0; nRow < nHeight; nRow++)  
  49.     {  
  50.         pucRow = (mat.ptr<uchar>(nRow));  
  51.         for (int nCol = 0; nCol < nWidth; nCol++)  
  52.         {  
  53.             if (1 == nChannels)  
  54.             {  
  55.                 *(pucImage + nRow * nStep + nCol) = pucRow[nCol];  
  56.             }  
  57.             else if (3 == nChannels)  
  58.             {  
  59.                 for (int nCha = 0 ; nCha < 3; nCha++)  
  60.                 {  
  61.                     *(pucImage + nRow * nStep + nCol * 3 + nCha) = pucRow[nCol * 3 + nCha];  
  62.                 }             
  63.             }  
  64.         }     
  65.     }  
  66. }  
  67.   
  68. void 你的类名::CImageToMat(CImage& cimage, Mat& mat)  
  69. {  
  70.     if (true == cimage.IsNull())  
  71.     {  
  72.         return;  
  73.     }  
  74.   
  75.   
  76.     int nChannels = cimage.GetBPP() / 8;  
  77.     if ((1 != nChannels) && (3 != nChannels))  
  78.     {  
  79.         return;  
  80.     }  
  81.     int nWidth    = cimage.GetWidth();  
  82.     int nHeight   = cimage.GetHeight();  
  83.   
  84.   
  85.     //重建mat  
  86.     if (1 == nChannels)  
  87.     {  
  88.         mat.create(nHeight, nWidth, CV_8UC1);  
  89.     }  
  90.     else if(3 == nChannels)  
  91.     {  
  92.         mat.create(nHeight, nWidth, CV_8UC3);  
  93.     }  
  94.   
  95.   
  96.     //拷贝数据  
  97.   
  98.   
  99.     uchar* pucRow;                                  //指向数据区的行指针  
  100.     uchar* pucImage = (uchar*)cimage.GetBits();     //指向数据区的指针  
  101.     int nStep = cimage.GetPitch();                  //每行的字节数,注意这个返回值有正有负  
  102.   
  103.   
  104.     for (int nRow = 0; nRow < nHeight; nRow++)  
  105.     {  
  106.         pucRow = (mat.ptr<uchar>(nRow));  
  107.         for (int nCol = 0; nCol < nWidth; nCol++)  
  108.         {  
  109.             if (1 == nChannels)  
  110.             {  
  111.                 pucRow[nCol] = *(pucImage + nRow * nStep + nCol);  
  112.             }  
  113.             else if (3 == nChannels)  
  114.             {  
  115.                 for (int nCha = 0 ; nCha < 3; nCha++)  
  116.                 {  
  117.                     pucRow[nCol * 3 + nCha] = *(pucImage + nRow * nStep + nCol * 3 + nCha);  
  118.                 }             
  119.             }  
  120.         }     
  121.     }  
  122. }  


    这篇关于OpenCV的Mat与ATL/MFC的CImage相互转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/337333

    相关文章

    Python中OpenCV与Matplotlib的图像操作入门指南

    《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

    C/C++中OpenCV 矩阵运算的实现

    《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

    C/C++的OpenCV 进行图像梯度提取的几种实现

    《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

    C/C++和OpenCV实现调用摄像头

    《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

    c/c++的opencv图像金字塔缩放实现

    《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

    c/c++的opencv实现图片膨胀

    《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

    Python使用FFmpeg实现高效音频格式转换工具

    《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

    使用Python实现网页表格转换为markdown

    《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

    qtcreater配置opencv遇到的坑及实践记录

    《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

    Python将字符串转换为小写字母的几种常用方法

    《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr