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实现获取视频时长的小工具

    《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

    关于集合与数组转换实现方法

    《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

    利用Python脚本实现批量将图片转换为WebP格式

    《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

    Python如何将OpenCV摄像头视频流通过浏览器播放

    《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

    使用Python和OpenCV库实现实时颜色识别系统

    《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

    OpenCV实现实时颜色检测的示例

    《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

    java Long 与long之间的转换流程

    《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

    在Java中将XLS转换为XLSX的实现方案

    《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

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

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

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

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