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<uchar>(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<Vec3b>(nrow,ncol);//用Vec3b也行  
  7.            cout   << "("<<bgr.val[0]<<","  
  8.                    <<bgr.val[1]<<","  
  9.                    <<bgr.val[2]<<")";  
  10.        }  
  11.        cout << endl;  
  12.     }  
2、使用指针读取

  1. forsize_t nrow = 0; nrow < img3.rows; nrow++)  
  2.     {  
  3.         uchar* data = img3.ptr<uchar>(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_<uchar> it = img4.begin<uchar>(), it_end = img4.end<uchar>();  
  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<<mat_CV_8UC1.at<ElementType>(nrow,ncol);      
    8.        }  
    9.    } 
  • 10
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
OpenCVMat是一个重要的数据类型,它是用来存储图像的。Mat可以看作是一个多维数组,它包含了图像的像素数据以及图像的元数据(如图像的大小,通道数,数据类型等)。 Mat的常用构造函数有以下几种: 1. Mat(): 创建一个空的Mat对象。 2. Mat(int rows, int cols, int type): 创建一个指定大小和类型的Mat对象。 3. Mat(Size size, int type): 创建一个指定大小和类型的Mat对象。 4. Mat(int rows, int cols, int type, Scalar s): 创建一个指定大小和类型,并用指定颜色初始化的Mat对象。 5. Mat(Size size, int type, Scalar s): 创建一个指定大小和类型,并用指定颜色初始化的Mat对象。 6. Mat(const Mat& m): 创建一个与给定Mat对象大小和类型相同的Mat对象,并复制给定对象的数据。 Mat的一些常用方法: 1. Mat::at(): 用于访问Mat对象的像素。 2. Mat::clone(): 创建一个与原Mat对象大小和类型相同的新对象,并将原对象数据复制到新对象。 3. Mat::convertTo(): 将Mat对象的像素转换成指定的数据类型。 4. Mat::copyTo(): 复制一个Mat对象到另一个Mat对象。 5. Mat::reshape(): 改变Mat对象的大小和通道数。 6. Mat::rows(): 返回Mat对象的行数。 7. Mat::cols(): 返回Mat对象的列数。 8. Mat::size(): 返回Mat对象的大小。 9. Mat::type(): 返回Mat对象的数据类型。 以下是一个简单的Mat的例子: ``` #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("lena.jpg", IMREAD_COLOR); if (image.empty()) { return -1; } Mat gray_image; cvtColor(image, gray_image, COLOR_BGR2GRAY); imshow("原图", image); imshow("灰度图", gray_image); waitKey(); return 0; } ``` 这段代码读取了一张彩色图像,将其转换为灰度图像,并显示在窗口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值