2017-08-10 161 views
1
p = img.ptr<uchar>(row); 

for (var i = 0; i < nColumns - 3; i+=3) { 
if(p[i] == b && p[i+1] == g && p[i+2] == r){ 
    count++; 
} 
} 

上面的代碼將顯然循環遍歷每一行並查看每個像素的值。然後在確認像素是某種顏色時,它會增加計數變量的值。OpenCV訪問像素的顏色值

我的困惑是:

  1. 如果.ptr表示指示器將矩陣的行的開始,怎麼可能在p變量封裝?
  2. 如果我們正在訪問像素的b, g, r(r,g,b)值 - 爲什麼我們正在查看矩陣的不同成員?矩陣的一行代表單個像素嗎?我認爲矩陣的一行表示圖像的對應行。

換句話說,爲什麼這個工作?

+3

你的循環有一個錯誤:你正在遞增1('''++'''') - 你應該遞增3。你當前的實現不能正確地檢查顏色值。 – Freakyy

+0

@Freakyy對不起。但我仍然不明白。你能回答我的問題嗎? – SR1

+1

有3個頻道:rgb這就是爲什麼 – Asesh

回答

1
  1. ptr<T>是一個模板函數時它被解釋爲的T秒的陣列,它返回一個指針到該行的開頭。
    因此,ptr<uchar>(row)是指向行號row的第一個uchar的指針。

  2. p不是指針的行或第一像素,但一個指針上的行的第一像素的第一部件
    由於圖像是BGR圖像,因此第一個像素的藍色分量是p[0],綠色是p[1],紅色是p[2]
    第二個像素的藍色是p[3+0],綠色是p[3+1],紅色是p[3+2]
    依此類推。

如果這是不可理解的,您可以在附近的C++書中閱讀有關數組和指針的更多信息。

+0

這真棒 - 正是我所需要的。非常感謝。 – SR1