簡體   English   中英

訪問像素值OpenCV 2.3 - C ++

[英]Accessing pixel values OpenCV 2.3 - C++

如何使用C ++訪問OpenCV 2.3中的各個像素?
對於我的U8C3圖像,我試過這個:

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 ,它是cv::Vec<uchar,3>typedef

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

然后,如果確實需要,可以將其轉換為cv::Scalar ,但cv::Mat::at instantiation的類型必須與圖像的類型匹配,因為它只是轉換圖像數據而不進行任何轉換。

您的第二個代碼段返回指向圖像第i行的指針。 它不是無關的數據,而只是指向單個uchar值的指針。 因此,在U8C3圖像的情況下,返回到p的數據中的每個連續3個元素應該代表一個像素。 再次,將每個像素作為單個元素使用

Vec3b *p = I.ptr<Vec3b>(i);

在返回之前,它再次只執行行指針的適當強制轉換。

編輯:如果你想在圖像上進行許多像素訪問,你也可以使用cv::Mat_便利類型。 這只不過是圖像數據周圍的類型化薄包裝器,因此所有對圖像像素的訪問都是適當的類型:

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

然后你可以自由地使用U(i, j)並且總是得到一個3元組的無符號字符,因此像素,再次沒有任何復制,只是類型轉換(因此與I.at<Vec3b>(i, j) )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM