1、定义
Mat curr_img0(test_pir_sz.cy, test_pir_sz.cx, CV_8UC3);Mat mat1 = Mat::ones(1, 5, CV_32F);
float K[3][3] = {fc[0], 0, cc[0], 0, fc[1], cc[1], 0, 0, 1}; //摄像机内参数矩阵K
cv::Mat mK = cv::Mat(3,3,CV_32FC1,K);
------------------------------------------------------------------------------------------------------------------------
2、复制
curr_img1.copyTo(curr_img0);
Mat类的两个拷贝函数,copyTo()和clone(),都是进行深复制,也就是会另外开辟一个内存存储被复制的数据区域,
对复制得到的新矩阵进行释放releas()不会影响原矩阵的数据(有其他方式会影响,后面遇到再讲)。这里的copyTo()和
clone()区别在于,copyTo()可选一个参数掩膜mask,根据mask的值选择复制区域。
------------------------------------------------------------------------------------------------------------------------
3、释放
Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1; // 仅创建一个mat2信息头, mat1,mat2 数据区的地址相同
Mat mat3 = Mat::zeros(1, 4, CV_32F);
mat2.release(); // 因为mat2是对mat1的引用,这里的mat2.release()只会清除mat2的信息头和数据指针
mat1.release(); // mat1的数据区都会被释放,但是mat信息头数据还会保存(也就是还能继续被赋值)
------------------------------------------------------------------------------------------------------------------------
4、遍历
at:
image.at<cv::Vec3b>(j,i);
ptr指针:
void colorReduce1(cv::Mat &image, int div=64) {
int nr= image.rows; // number of rows
int nc= image.cols * image.channels(); // total number of elements per line
for (int j=0; j<nr; j++) {
uchar* data= image.ptr<uchar>(j);
for (int i=0; i<nc; i++) {
*data++= *data/div*div + div/2;
} // end of row
}
}
指针:
void colorReduce4(cv::Mat &image, int div=64) {
int nr= image.rows;
int nc= image.cols * image.channels();
int step= image.step;
uchar *data= image.data;
for (int j=0; j<nr; j++) {
for (int i=0; i<nc; i++) {
*(data+i)= 2;
} // end of row
data+= step; // next line
}
}
iterator:
void colorReduce8(cv::Mat &image, int div=64) {
// get iterators
cv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();
for ( ; it!= itend; ++it) {
(*it)[0]= (*it)[0]/div*div + div/2;
(*it)[1]= (*it)[1]/div*div + div/2;
(*it)[2]= (*it)[2]/div*div + div/2;
}
}
------------------------------------------------------------------------------------------------------------------------
5、
Mat::setTo
将阵列中所有的或部分的元素设置为指定的值。
C++: Mat& Mat::setTo(const Scalar& s, InputArray mask=noArray())
Mat::rowRange
为指定的行span创建一个新的矩阵头。
C++: Mat Mat::rowRange(int startrow, int endrow) const
C++: Mat Mat::rowRange(const Range& r) const
Mat::colRange
为指定的行span创建一个矩阵头。
C++: Mat Mat::colRange(int startcol, int endcol) const
C++: Mat Mat::colRange(const Range& r) const
------------------------------------------------------------------------------------------------------------------------
6、其他
对于数学计算还有一些基本的构造函数,如Mat::eye()对角阵(当行、列不同时,主对角线为1)、Mat::ones()单位阵、Mat::zeros()零
矩阵等。用一个矩阵的一行复制到另外一行,不能通过直接复制,必须通过运算才行(运算的结果会返回一个实际的矩阵)。如矩阵mat的
第1行复制到第2行,代码为 mat.row(1)=mat.row(0) 无效,但是 mat.row(1)=mat.row(0)+0; 或者 mat.row(1)=mat.row(0)+mat.row(2);
都是有效的。
------------------------------------------------------------------------------------------------------------------------