OpenCV中Mat的一些常用操作(网络资料整理)

来源:互联网 发布:php 取小数点后两位 编辑:程序博客网 时间:2024/06/01 08:20

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); 
都是有效的。
------------------------------------------------------------------------------------------------------------------------