使用 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 文件 。