使用 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_8UC1uchar pixelGrayValue = image.at<uchar>(r,c)
  • 對於 CV_8UC3cv::Vec3b pixelColor = image.at<cv::Vec3b>(r,c)cv::Vec3b 物件表示 uchar 值的三元組(0 到 255 之間的整數)。
  • 對於 CV_32FC1float pixelGrayValue = image.at<float>(r,c)
  • 對於 CV_32FC3cv::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 文件