CvMatとIplImageへのアクセス,ついでにnチャネルの話


OpenCVの用意する型の値へのアクセス法がいまいちわからん.どれがいいんだろう.
取り敢えず行列*mのi行j列にアクセスするやり方も,

m->data.fl[i*row+j];
cvmGet(m,i,j);


とかある..flはfloat型(32F)の時.
どっか体系的にまとめられてるとこあったら誰か教えてください.奈良先のあれもなー.


あと,チャネルの意味ようやくわかった….意味と言うか,宣言とアクセスのしかた.たとえばnチャネルのfloat型の行列*mを宣言するときには,
CvMat *m = cvCreateMat(row,col,CV_32FCn);
とする.各要素がn個の32Fを持つことを表す.このとき要素(i,j)のk番目の値にアクセスするには,

m -> data.fl[(j*col + i)*3 + k]


で求める.…たぶん.まだcol=1(i=0のみ)の時しか試してないので,確かなことはなんとも.


IplImageの方も,*imgの(i,j)のR,G,Bの値を見ようとすれば,

img->imageData[(j*width + i)*3+0]  // Blue
img->imageData[(j*width + i)*3+1]  // Green
img->imageData[(j*width + i)*3+2]  // Red

ってのを今日知った.むずー.(大体なんでカラーの順番がBGRなんだ….RGBは日本だけなの?)
最初はマクロ使ってたんだけど,頻繁に呼ぶと重くなりそうな気がしたので(特に理由は知らないが),最近はポインタで直接指定してる.って…あれ?そうか,配列番号を添え字にしてんのと一緒か.配列のポインタ指定と添え字指定は完全に同じ速度で読み込めるのかな.今後○ゃ○に聞いてみよう.