如何使用C++訪問OpenCV 2.3中的單個像素?
對於我U8C3像我嘗試這樣做:訪問像素值OpenCV 2.3 - C++
Scalar col = I.at<Scalar>(i, j);
和
p = I.ptr<uchar>(i);
首先是拋出一個異常,第二個是將一些不相關的數據。我所能找到的所有例子都是針對C版OpenCV的舊IIPimage(?)。
我需要的只是在給定的座標下獲取像素的顏色。
如何使用C++訪問OpenCV 2.3中的單個像素?
對於我U8C3像我嘗試這樣做:訪問像素值OpenCV 2.3 - C++
Scalar col = I.at<Scalar>(i, j);
和
p = I.ptr<uchar>(i);
首先是拋出一個異常,第二個是將一些不相關的數據。我所能找到的所有例子都是針對C版OpenCV的舊IIPimage(?)。
我需要的只是在給定的座標下獲取像素的顏色。
您調用cv::Mat::at
的類型需要匹配各個像素的類型。由於cv::Scalar
基本上是cv::Vec<double,4>
,因此這不適用於U8C3
圖片(當然,它將適用於F64C4
圖片)。
在你的情況,你需要一個cv::Vec3b
,這是一個typedef
爲cv::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)
相同)。
感謝您的快速響應。我真的很困惑與多個渠道,他們如何存儲。 – jnovacho