Mat
1、Mat用C++管理,更为方便,IplImage(用C语言)。
2、由矩阵头(包括矩阵大小,存储方法,指针地址)和数据指针(图像内容的指针)组成。
3、Mat赋值只赋矩阵头信息,图像内容是共享的。
例如:
Mat A, C; // creates just the header parts
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // here we'll know the method used (allocate matrix)
Mat B(A); // Use the copy constructor
C = A; // Assignment operator
4、Mat也可以只要某图像的一部分,用于感兴趣区域的分割(ROI),
例如:
Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle
Mat E = A(Range::all(), Range(1,3)); // using row and column boundaries
5、如果要赋值整幅图像用clone()和copyTo(),
例如:
Mat F = A.clone();
Mat G;
A.copyTo(G);
Storing methods(矩阵头中的存储方法)
包括:颜色空间和数据类型。
颜色空间:RGB,HSV和HLS,YCrCb,L*a*b。
实例
1、读取和显示
Load, Modify, and Save an Image
#include <cv.h>
#include <highgui.h>
using namespace cv;
int main( int argc, char** argv )
{
char* imageName = argv[1];
Mat image;
image = imread( imageName, 1 );
if( argc != 2 || !image.data )
{
printf( " No image data \n " );
return -1;
}
Mat gray_image;
cvtColor( image, gray_image, CV_BGR2GRAY );
imwrite( "../../images/Gray_Image.jpg", gray_image );
namedWindow( imageName, CV_WINDOW_AUTOSIZE );
namedWindow( "Gray image", CV_WINDOW_AUTOSIZE );
imshow( imageName, image );
imshow( "Gray image", gray_image );
waitKey(0);
return 0;
}
2、Mat初始化
构造
Mat M(2,2, CV_8UC3, Scalar(0,0,255));//scalar是四维的
cout << "M = " << endl << " " << M << endl << endl;
CV_8UC3的格式
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]创建多维矩阵
int sz[3] = {2,3,4}; //三维矩阵每一维度的个数
Mat L(3,sz, CV_8UC(1), Scalar::all(0));\\3 代表三维矩阵从IplImage创建Mat
IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // convert IplImage* -> Mat用函数zeros(), ones(), eye()
Mat A;
A = Mat::zeros(3, 3, CV_32F);
A = Mat::ones(100, 100, CV_8U)*3; // make 100x100 matrix filled with 3.
A = Mat::eye(4, 4, CV_32F)*0.1;// make a 4x4 diagonal matrix with 0.1's on the diagonal.用函数create()
M.create(4,4, CV_8UC(2));
cout << "M = "<< endl << " " << M << endl << endl;
小矩阵
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "C = " << endl << " " << C << endl << endl;
复制某一行
Mat RowClone = C.row(1).clone();
cout << "RowClone = " << endl << " " << RowClone << endl << endl;随机函数randu()
Mat R = Mat(3, 2, CV_8UC3);
randu(R, Scalar::all(0), Scalar::all(255));
3、格式化输出
- Default
cout << "R (default) = " << endl << R << endl << endl;
- Python
cout << "R (python) = " << endl << format(R,"python") << endl << endl;
原文出自OpenCV官网英文文档,笔记记录了Mat相关的知识点。