Cximage<---->Mat 、Cximage<---->lplImage 以及 lplImage<----->Mat的转换、像素位深度

本文介绍了OpenCV中IplImage、Mat与CvMat之间的转换方法,包括数据共享和复制。同时讨论了Mat的内存管理和显示方法,并深入解析了像素位深度的概念。此外,还提到了与CxImage开源库的互转,以及Mat中数据元素的地址计算和矩阵布局的步长概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.传统的lplImage * -------> Mat格式
IplImage* img = cvLoadImage("greatwave.png", 1);  

Mat mtx(img); //  IplImage* ->Mat 共享数据


2、Mat  -----> IplImage:

(1)将Mat类型转换到 IplImage *类型

Mat   image1;  

IplImage  *image2 = (&(IplImage)image1);  //同样只是创建图像头,而没有复制数据。

cvsaveimage("c:\\image2.jpg",image2);//保存下来

(2)将Mat类型转换到 IplImage类型

只是创建图像头,而没有复制数据

例:

IplImage ipl_img = img; // Mat -> IplImage (此处img 是Mat 类型)

cvsaveimage("c:\\image2.jpg",&ipl_img);//保存下来

3、将CvMat类型转换为Mat类型
与IplImage的转换类似,可以选择是否复制数据。

Mat b = Mat(const CvMat* a, true);
 

//使用Mat的构造函数:Mat::Mat(const CvMat* m, bool copyData=false);    默认情况下copyData为false
CvMat* a;
//注意:以下三种效果一致,均为浅拷贝
Mat b(a);    //a "copy" to b
Mat b(a, false);    //a "copy" to b
Mat b = a;    //a "copy" to b

//注意:当将参数copyData设为true后,则为深拷贝(复制整个图像数据)
Mat b = Mat(a, true); //a copy to b


4、将Mat类型转换为CvMat类型
与IplImage的转换类似,不复制数据,只创建矩阵头。

例:// 假设Mat类型的imgMat图像数据存在

CvMat cvMat = imgMat; // Mat -> CvMat

 

 

 

 

 

//注意:浅拷贝
Mat a;
CvMat b = a; //a "copy" to b

//注意:深拷贝
Mat a;
CvMat *b;
CvMat temp = a; //转化为CvMat类型,而不是复制数据
cvCopy(&temp, b); //真正复制数据 cvCopy使用前要先开辟内存空间

 

 

 

Mat之间的复制

 

//注意:浅拷贝 -  不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)
Mat a;
Mat b = a; //a "copy" to b
Mat c(a); //a "copy" to c

//注意:深拷贝
Mat a;
Mat b = a.clone(); //a copy to b
Mat c;
a.copyTo(c); //a copy to c

 

 

 

CvMat之间的复制

 

//注意:深拷贝 - 单独分配空间,两者相互独立  
CvMat* a;  
CvMat* b = cvCloneMat(a);   //copy a to b  
 

 

 

 

 

5、 (1)IplImage转Cvmat

   IplImage* src = cvLoadImage("rice.bmp",0);
   CvMat* mat=cvCreateMat(src->height,src->width,CV_32SC1);

   cvConvert(src,mat);

或者:Cvmat matObj;

   * mat=cvGetmat(src,&matObj);

  (2)Cvmat转IplImage
    IplImage* pImg = cvCreateImage(cvGetSize(mat),8,1);   
    cvGetImage(matI,pImg);

     cvSaveImage("rice1.bmp",pImg);

 

4.1 IplImage与IplImage*

 

  IplImage* imgTemp = cvCreateImage(cvSize(s_size, s_size), 8, 3);

  IplImage temp = imgRGB.rowRange(rangeL, rangeR).colRange(valL, valR);
  cvResize(&temp, imgTemp);

5、CxImage 开源库与Opencv (Mat)互转

 //to Mat
CxImage img;
img.Load( "C:\\f.jpg" );
uint8_t *buf=NULL;
int32_t  len=0;
bool rs =img.Encode(buf,len,CXIMAGE_FORMAT_BMP);
cv::Mat temp2;
vector<uchar> buff2;
buff2.resize(len);
memcpy (&buff2[0],buf,len);
temp2= cv::imdecode(buff2,1);
delete []buf; //要释放buf,这个buf在函数里分配了内存
 
 
 
cv::imshow( "111" ,temp2);
cv::waitKey();
 
//to Cximage
vector<uchar> buff;
cv::imencode( ".bmp" ,temp2,buff);
CxImage img2(&buff[0],buff.size(),CXIMAGE_FORMAT_BMP);
img2.Blt(GetDlgItem(IDC_STATIC_P)->GetDC()->GetSafeHdc());
 
 

6、OpenCV2CXimage.h

#pragma once   
/* 
* 类说明:OpenCV图像与CXimage图像互转 
* 用于OpenCV的图像与CXimage图像格式互转进行封装。 OpenCV的图像位数必须是大等于8的整数倍,支持BMP,JPG图像格式;CXimage的图像位数可以是1、2、4、8、、24,支持BMP,JPG,TIF,PNG,GIF图像格式。 
*/  

#include <stdio.h>
#include "h/ximage.h"   
#include <opencv2/opencv.hpp>
#pragma comment(lib,"lib/cximage.lib")
#pragma comment(lib,"lib/Jpeg.lib")
#pragma comment(lib,"lib/libpsd.lib")
#pragma comment(lib,"lib/png.lib")
#pragma comment(lib,"lib/zlib.lib")
#pragma comment(lib,"lib/tiff.lib")
#pragma comment(lib,"lib/jasper.lib")
#pragma comment(lib,"lib/libdcr.lib")
#pragma comment(lib,"lib/jbig.lib")  
#pragma comment(lib,"lib/mng.lib")  

using namespace cv;
using namespace std;  
  
#include <opencv2/opencv.hpp>

#ifdef _DEBUG   
    #pragma comment(lib, "opencv_core249d.lib")   
    #pragma comment(lib, "opencv_highgui249d.lib")   
    #pragma comment(lib, "opencv_imgproc249d.lib")   
#else   
    #pragma comment(lib, "opencv_core249.lib")   
    #pragma comment(lib, "opencv_highgui249.lib")   
    #pragma comment(lib, "opencv_imgproc249.lib")   
#endif   
  
class OpenCV2CXimage  
{  
public:  
    OpenCV2CXimage(void);  
    ~OpenCV2CXimage(void);  
  
    /* 
    功能说明: 获取黑点标记的方式 
    参数说明:  cxImage 图像处理类 
    返回值: 黑点标记 
    */  
    static int OpenCV2CXimage::GetBlackColor(CxImage cxImage);  
  
    /* 
    功能说明: 获取白点标记的方式 
    参数说明:  cxImage 图像处理类 
    返回值: 黑点标记 
    */  
    static int OpenCV2CXimage::GetWhiteColor(CxImag
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值