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