使用 cvMatatT() 访问单个像素值
要访问 OpenCV cv::Mat
对象中的像素值,首先必须知道矩阵的类型。
最常见的类型是:
CV_8UC1
用于 8 位 1 通道灰度图像;CV_32FC1
用于 32 位浮点 1 通道灰度图像;CV_8UC3
用于 8 位 3 通道彩色图像; 和CV_32FC3
用于 32 位浮点 3 通道彩色图像。
cv::imread
的默认设置将创建一个 CV_8UC3
矩阵。
要访问单个像素,最安全的方法虽然不是最有效的,但是使用 cv::Mat::at<T>(r,c)
方法,其中 r
是矩阵的行,c
是列。模板参数取决于矩阵的类型。
让我们说你有一个 cv::Mat image
。根据其类型,访问方法和像素颜色类型将不同。
- 对于
CV_8UC1
:uchar pixelGrayValue = image.at<uchar>(r,c)
。 - 对于
CV_8UC3
:cv::Vec3b pixelColor = image.at<cv::Vec3b>(r,c)
。cv::Vec3b
对象表示uchar
值的三元组(0 到 255 之间的整数)。 - 对于
CV_32FC1
:float pixelGrayValue = image.at<float>(r,c)
。 - 对于
CV_32FC3
:cv::Vec3f pixelColor = image.at<cv::Vec3f>(r,c)
。cv::Vec3f
对象表示float
值的三元组。
请注意,OpenCV 以行主要顺序表示图像,例如 Matlab 或代数中的约定。因此,如果你的像素坐标是 (x,y)
,那么你将使用 image.at<..>(y,x)
访问像素。
或者,at<>
也支持通过单个 cv::Point
参数进行访问。
在这种情况下,访问以列为主 :
image.at<..>(cv::Point(x,y));
有关此方法的更多详细信息,请查看 OpenCV 文档 。