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);
//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