2011-11-15 65 views
6

如何使用C++訪問OpenCV 2.3中的單個像素?
對於我U8C3像我嘗試這樣做:訪問像素值OpenCV 2.3 - C++

Scalar col = I.at<Scalar>(i, j); 

p = I.ptr<uchar>(i); 

首先是拋出一個異常,第二個是將一些不相關的數據。我所能找到的所有例子都是針對C版OpenCV的舊IIPimage(?)。

我需要的只是在給定的座標下獲取像素的顏色。

回答

9

您調用cv::Mat::at的類型需要匹配各個像素的類型。由於cv::Scalar基本上是cv::Vec<double,4>,因此這不適用於U8C3圖片(當然,它將適用於F64C4圖片)。

在你的情況,你需要一個cv::Vec3b,這是一個typedefcv::Vec<uchar,3>

Vec3b col = I.at<Vec3b>(i, j); 

然後,您可以轉換成cv::Scalar這一點,如果你真的需要,但cv::Mat::at實例的類型必須匹配類型的圖像,因爲它只是投射圖像數據而沒有任何轉換。

你的第二個代碼片段返回一個指向圖像第i行的指針。這不是無關的數據,而只是一個指向單個值的指針。因此,如果是U8C3圖像,則返回到p的數據中的每個連續3個元素應代表一個像素。同樣,要將每個像素作爲一個單獨的元素使用,在返回它之前,它只不過是對行指針進行適當的轉換而已,只不過是做了其他任何事情。

編輯:如果要在圖像上進行多次像素訪問,還可以使用cv::Mat_便捷類型。這無非是圖像數據圍繞一個類型的瘦包裝更多,讓所有訪問圖像像素適當類型:

Mat_<Vec3b> &U = reinterpret_cast<Mat_<Vec3b>&>(I); 

然後,您可以自由使用U(i, j),一定可以得到的無符號字符的3元組,因此像素,再次沒有任何複製,只需鍵入強制轉換(因此性能與I.at<Vec3b>(i, j)相同)。

+0

感謝您的快速響應。我真的很困惑與多個渠道,他們如何存儲。 – jnovacho