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

    相关文章

    JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

    《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

    opencv实现像素统计的示例代码

    《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

    Java将时间戳转换为Date对象的方法小结

    《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

    基于C#实现将图片转换为PDF文档

    《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

    使用opencv优化图片(画面变清晰)

    文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

    opencv 滚动条

    参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

    android-opencv-jni

    //------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

    OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

    操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

    PDF 软件如何帮助您编辑、转换和保护文件。

    如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

    C# double[] 和Matlab数组MWArray[]转换

    C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };