2009-06-15 1 views
2

私はオブジェクト検出にOpenCVを使用していますが、実行できる操作の1つはピクセル単位の平方根です。私の質問は、私はIplImageへのオブジェクトの座標(x、y)の画素値にアクセスする方法であるOpenCV:ピクセルの平方根にアクセスして撮影する

IplImage* img_; 
... 
for (int y = 0; y < img_->height; y++) { 
    for(int x = 0; x < img_->width; x++) { 
    // Take pixel square root here 
    } 
} 

:私は、ループのようなものになるだろうと想像しますか?

答えて

3

仮定IMG_型IplImageへのものであり、16ビット符号なし整数データと仮定すると、Iは

unsigned short pixel_value = ((unsigned short *)&(img_->imageData[img_->widthStep * y]))[x]; 

がIplImageへの定義にもhere参照言います。

+0

ありがとう、これは間違いなく役に立ちました:) –

+3

そして私はOpenCVを全く知らない –

1

OpenCV IplImageは1次元配列です。画像データを取得するには、単一のインデックスを作成する必要があります。ピクセルの位置は、色の深さと画像のチャンネル数に基づいて決まります。

// width step 
int ws = img_->withStep; 
// the number of channels (colors) 
int nc = img_->nChannels; 
// the depth in bytes of the color 
int d = img_->depth&0x0000ffff) >> 3; 
// assuming the depth is the size of a short 
unsigned short * pixel_value = (img_->imageData)+((y*ws)+(x*nc*d)); 
// this gives you a pointer to the first color in a pixel 
//if your are rolling grayscale just dereference the pointer. 

ピクセルポインタpixel_value ++を移動してチャンネル(色)を選択できます。これは、リアルタイムアプリケーションの任意の並べ替えになる場合は、ピクセルの平方根のルックアップテーブルを使用することをお勧めします。

0

Gady Agamの素晴らしいOpenCVチュートリアルhereには、いくつかのイメージ要素があります。

1

CV_IMAGE_ELEMマクロを使用してください。 また、ピクセルで作業する代わりにpower = 0.5のcvPowを使用することをお勧めします。これは避けてください。