Opencv中Mat中元素的值读取方法总结

1、利用 at 函数读取

(1)单通道图像读取方式

  1. Mat img1 = imread(filename,IMREAD_GRAYSCALE);  
  2.    forsize_t nrow = 0; nrow < img1.rows; nrow++)  
  3.    {  
  4.        for(size_t ncol = 0; ncol < img1.cols; ncol++)  
  5.        {  
  6.            uchar val = mat_CV_8UC1.at(nrow,ncol);      
  7.        }  
  8.    }  
(2) 三通道图像读取方式

  1. Mat img2 = imread(filename,IMREAD_COLOR);  
  2.    forsize_t nrow = 0; nrow < img2.rows; nrow++)  
  3.     {  
  4.        for(size_t ncol = 0; ncol < img2.cols; ncol++)  
  5.        {  
  6.            Vec3i bgr = mat_CV_8UC3.at(nrow,ncol);//用Vec3b也行  
  7.            cout   << "("<","  
  8.                    <","  
  9.                    <")";  
  10.        }  
  11.        cout << endl;  
  12.     }  
2、使用指针读取

  1. forsize_t nrow = 0; nrow < img3.rows; nrow++)  
  2.     {  
  3.         uchar* data = img3.ptr(nrow);  
  4.        for(size_t ncol = 0; ncol < img3.cols * img3.channels(); ncol++)  
  5.        {  
  6.             cout << int( data[ncol] ) ;  
  7.        }  
  8.        cout << endl;  
  9.     }  
3、使用迭代器

  1. Mat img4 = imread(filename,IMREAD_GRAYSCALE);
  2. MatIterator_ it = img4.begin(), it_end = img4.end();  
  3.    for(int cnt = 1; it != it_end; ++it)  
  4.     {  
  5.         cout << ( int(*it) ) ;  
  6.         if( (cnt++ % img4.cols) ==0 )  
  7.             cout << endl;       
  8.     }  
4、使用矩阵元素的地址定位知识

  1. Mat img5(rows, cols,CV_8U, Scalar(0));
  2. forsize_t nrow = 0; nrow < img5.rows; nrow++)  
  3. for(size_t ncol = 0; ncol < img5.cols; ncol++)
  4.     {  
  5.        cout<<(int)(*(img5.data+img5.step[0]*nrow+img5.step[1]*ncol));
  6.     }  

5、补充:在使用 at 函数的情况下需要预先知道Mat变量中存储的元素类型,如果类型不匹配就会出现读错误。所以可以采用c++  boost库中的BOOST_TYPEOF来获取图像的元素数据类型。

例:

    1. Mat img6 = imread(filename);
    2. typedef BOOST_TYPEOF(*img6.data) ElementType
    3. forsize_t nrow = 0; nrow < img1.rows; nrow++)  
    4.    {  
    5.        for(size_t ncol = 0; ncol < img1.cols; ncol++)  
    6.        {  
    7.         cout<(nrow,ncol);      
    8.        }  
    9.    } 

你可能感兴趣的:(OpenCV)