opencv学习笔记三(Mat对象)
Mat对象Mat对象与IplImage对象Mat对象构造函数与常用方法
Mat对象使用Mat对象使用-四个要点Mat对象创建
Mat定义数组代码实现
Mat对象
Mat对象与IplImage对象
Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分IplImage是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题
Mat对象构造函数与常用方法
常用方法:
void copyTo(Mat mat)void convertTo(Mat dst, int type)Mat clone()int channels()int depth()bool empty();uchar* ptr(i=0)
Mat对象使用
部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分 Mat A= imread(imgFilePath); Mat B(A) // 只复制完全复制:如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现 Mat F = A.clone(); 或 Mat G; A.copyTo(G);
Mat对象使用-四个要点
输出图像的内存是自动分配的使用OpenCV的C++接口,不需要考虑内存分配问题赋值操作和拷贝构造函数只会复制头部分使用clone与copyTo两个函数实现数据完全复制
Mat对象创建
cv::Mat::Mat构造函数 Mat M(2,2,CV_8UC3, Scalar(0,0,255)) 其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致 创建多维数组cv::Mat::create int sz[3] = {2,2,2}; Mat L(3,sz, CV_8UC1, Scalar::all(0));cv::Mat::create实现 Mat M; M.create(4, 3, CV_8UC2); M = Scalar(127,127); cout << “M = " << endl << " " << M << endl << endl; uchar* firstRow = M.ptr(0); printf(”%d", *firstRow);
Mat定义数组
Mat C = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); cout << "C = " << endl << " " << C << endl << endl;
代码实现
#include
<opencv2
/opencv
.hpp
>
#include
<iostream
>
using namespace std
;
using namespace cv
;
int
main(){
Mat src
;
src
= imread("2.jpg");
if (src
.empty()){
cout
<< "could not load image..." << endl
;
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input",src
);
Mat dst
;
src
.copyTo(dst
);
namedWindow("output", CV_WINDOW_AUTOSIZE);
cvtColor(src
, dst
, CV_BGR2GRAY);
printf("input image channels : %d\n", src
.channels());
printf("output image channels : %d\n", dst
.channels());
int cols
= dst
.cols
;
int rows
= dst
.rows
;
printf("rows : %d cols : %d\n", rows
, cols
);
const uchar
* firstRow
= dst
.ptr
<uchar
>(0);
printf("fist pixel value : %d\n", *firstRow
);
imshow("output", dst
);
Mat
M(3, 3, CV_8UC3, Scalar(0, 0, 255));
cout
<< "M =" << endl
<< M << endl
;
imshow("outputM", M);
Mat m1
;
m1
.create(src
.size(), src
.type());
m1
= Scalar(0, 0, 255);
imshow("outputm1", m1
);
Mat csrc
;
Mat kernel
= (Mat_
<char
>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src
, csrc
, -1, kernel
);
imshow("outputcsrc", csrc
);
Mat m2
= Mat
::zeros(src
.size(), src
.type());
imshow("outputm2 ", m2
);
Mat m3
= Mat
::eye(3, 3, CV_8UC1);
cout
<< "m3 =" << endl
<< m3
<< endl
;
waitKey(0);
return 0;
}