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

    相关文章

    C#实现将Excel表格转换为图片(JPG/ PNG)

    《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

    C++使用printf语句实现进制转换的示例代码

    《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

    使用Python开发一个带EPUB转换功能的Markdown编辑器

    《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

    在PyCharm中安装PyTorch、torchvision和OpenCV详解

    《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

    openCV中KNN算法的实现

    《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

    OpenCV图像形态学的实现

    《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

    Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

    《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

    golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

    《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

    Python实现AVIF图片与其他图片格式间的批量转换

    《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

    详解如何通过Python批量转换图片为PDF

    《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核