2012-04-02 16 views
14

Mat (veya Mat3b) değişkeninden pikselleri düzenlemek/okumak için etkili bir yol arıyorum.Mat değişkeni OpenCv'deki piksel değerlerini nasıl düzenler/okuyabilirim?

Image.at<Vec3b>(i,j) 

ama çok yavaş gibi görünüyor: -

ben kullandım.

Ben de bu kullandı: -

A.data[A.channels()*A.cols*i + j + 0] 

ama bu döngü

for(i=0; j<A.rows; i++){ 
    for(j=0; j<A.cols; j++){ 
      A.data[A.channels()*A.cols*i + j + 0] = 0; 
      A.data[A.channels()*A.cols*i + j + 1] = 0; 
      A.data[A.channels()*A.cols*i + j + 2] = 0; 
    } 
} 

sadece görüntünün bir kısmı kararmış olduğu çalıştırdığınızda Bununla Karşılıklı sorun olduğunu.

+0

Orada kabul cevabı haklı olarak belirttiği gibi Mat öğelerine erişmek için hızlı bir yoldur, ancak yayın modunda programınızı çalıştıran bir sürü mat hızlandırır .at () erişir. İşaretçi erişimi – Sam

cevap

18

Here işaretçi oluşturun hızlı eleman erişimi için bazı olasılıklar görebilirsiniz.

Ancak yolunuzu yapmak isterseniz, bir parantez eklemeniz gerekir. Aksi size endeks hesaplama doğru değil:

for(int i=0; i<A.rows; i++){ 
    for(int j=0; j<A.cols; j++){ 
      A.data[A.channels()*(A.cols*i + j) + 0] = 0; 
      A.data[A.channels()*(A.cols*i + j) + 1] = 0; 
      A.data[A.channels()*(A.cols*i + j) + 2] = 0; 
    } 
} 

Ama hafıza düzeni dolgu nedeniyle bitişik olması garanti edilmez. Yani this göre Bunun yerine böyle bir formül kullanmalısınız:

for(int i=0; i<A.rows; i++){ 
    for(int j=0; j<A.cols; j++){ 
      A.data[A.step[0]*i + A.step[1]* j + 0] = 0; 
      A.data[A.step[0]*i + A.step[1]* j + 1] = 0; 
      A.data[A.step[0]*i + A.step[1]* j + 2] = 0; 
    } 
} 
+0

A.data'dan biraz daha yavaş olacaktır [A.step [0] * i + A.step [1] * j + 0] = 0; Bu satır bana hata veriyor. –

+2

A.data [A.step * i + A.channels() * j + 0] kullandım, bu iyi çalışıyor. Teşekkürler, önceki yönteme göre çok daha az zaman alıyor. :) –

14

Bu, cv :: Mat'dan pikselleri düzenlemek/okumak için en etkili yollardan biridir. (Gerekirse belirli kanalın) bir satıra

for(int i=0; i<A.rows;i++){ 
    uchar* rowi = A.ptr/*<uchar>*/(i); 
    for(int j=0; j<A.cols; j++){ 
    doProcessOnPixel(rowi[j]); 
    } 
}