OpenCV学习笔记:像素值读取at()函数
最近在编程实现大津算法时,需要对图像的像素点进行操作,自然不可避免地要接触 at()函数 ,下面开始详细介绍。
1.语法
单通道图像: Mat.at<存储类型名称>(行,列)
多通道图像: Mat.at<存储类型名称>(行,列)[通道]
2.示例
Mat image;
image.at<uchar>(25,43); //若image为单通道影像
image.at<Vec3b>(25,43)[2]; //若image为多通道影像
3.说明
(1)由于OpenCV中是按BGR的顺序表示的,因此对于RGB图像来说,[通道]取值为0时表示B波段(或分量),[通道]取值为1时表示G波段(或分量),[通道]取值为2时表示R波段(或分量)。
(2)按矩阵类型去选择<存储类型名称>:
如果矩阵类型为 CV_8U,则使用 Mat.at<uchar>(i,j) ;
如果矩阵类型为 CV_8S,则使用 Mat.at<schar>(i,j) ;
如果矩阵类型为 CV_16U,则使用 Mat.at<ushort>(i,j) ;
如果矩阵类型为 CV_16S,则使用 Mat.at<short>(i,j) ;
如果矩阵类型为 CV_32s,则使用 Mat.at<int>(i,j) ;
如果矩阵类型为 CV_32F,则使用 Mat.at<float>(i,j) ;
如果矩阵类型为 CV_64F,则使用 Mat.at<double>(i,j) ;
(3)具有单个索引(i)的变体可用于访问单行或单列二维矩阵的元素。例如,假设A是1N的二维浮点矩阵,B是M1的二维整型矩阵,当要访问矩阵A的第1行第4列的元素时,可以使用语句:
A.at<float>(3)
而不必要写成:
A.at<float>(0,3)
当要访问矩阵B的第4行第1列的元素时,可以使用语句:
B.at<int>(3)
而不必要写成:
B.at<int>(3,0)
(4)对于不是单行或单列的二维矩阵,若使用单个索引(i)是默认访问矩阵第一行的元素(即row=0)。例如:矩阵A为m*n的二维整型矩阵,那么
A.at<int>(4) 等价于 A.at<int>(0,4)
End & Enjoy!