【原】OPenCV学习笔记2:Mat 和cvMat
cv::Mat和CvMat都可以表示图像数据,其中cv::Mat是一个类(Class),是C++接口,而CvMat是一个Struct,从类型上就可以知道二者存在很大区别。前者除了几个成员变量之外还有很多的成员函数和重载函数,可以实现很多的图像数据处理功能,而后者只有几个成员变量,要对其成员进行一些处理,需要借用别的函数。
下面是CvMat的定义:
View Code
typedef struct CvMat { int type; int step; /* for internal use only */ int* refcount; int hdr_refcount; union //数据的指针 { uchar* ptr; short* s; int* i; float* fl; double* db; } data; #ifdef __cplusplus union { int rows; int height; }; union { int cols; int width; }; #else int rows; int cols; #endif } CvMat;
cv::Mat的使用完全当作C++的类使用:
Mat提供了很多的重载的构造函数:
View Code
用Mat类取代了之前用extended C写的cvMat和lplImage,更加好用啦,最大的好处就是更加方便的进行内存管理
输出Mat里面的元素:用Scalar初始化。
Mat mat(4,4,CV_32FC2,Scalar(1,3)); Mat m(2,2,CV_8UC3,Scalar(0,0,255)); cout<<mat<<endl<<endl; cout<<m<<endl<<endl;
传统的IplImage可以转化为Mat格式:利用构造函数Mat(const IplImage* img, bool copyData=false);
// 构造函数Mat(const IplImage* img, bool copyData=false); IplImage * img=cvLoadImage("lena.jpg",1); Mat mtx(img);
从Mat到IplImage:
Mat image; IplImage*pi=&image.operator IplImage();
CvMat* ci=&image.operator CvMat();
cv::Mat还有其他有点:
1.Mat结构更加友好,很多操作更接近matlab的风格
2.也有Point2f,Point3f,vector等数据结构可以使用
3.RNG类可以产生随机数
4.实现颜色通道的分离使用函数split