2012-01-21 29 views
1

CのOpenCVでprintfを使用して画面のピクセル値を出力しようとしていますが、ガベージ値を取得するだけです。 IPL_DEPTH_8U(8ビット符号なし整数)イメージを画面に出力し、IPL_DEPTH_32F(32ビット浮動小数点)イメージを画面に出力するにはどうすればよいですか?ベローは私が使用しているコードです。違いますか?それは正しいかもしれないが、私はちょうど私が予想していないピクセル値を取得する:opencv画像から画面にピクセル値を出力する

これらはところで、単一チャンネルの画像です:

for (y = 0; y < img->height; y++){ 
    uchar *ptr = (uchar*)(img->imageData + y * img->widthStep); 
    for (x = 0; x < img->width; x++){ 
     printf("%u, ", ptr[x]); 
    } 
    printf("\n"); 
} 

IPL_DEPTH_8U画像のためである、と私はそれが正常に動作している疑いがあること。 32浮動画像の場合、私はポインタをfloat *に変更し、printfの指定子を '%f'に変更しても動作しないようです。なにが問題ですか?

これらは正しいポインタと指定子ですか?また、16ビット符号付き整数と32ビット符号付き浮動小数点のポインタと指定子は何ですか?

ありがとうございました。私はちょうどこのウェブサイトを使い始めると、皆さんは素晴らしいです!

+1

この[link](http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html)またはこの[link](http:// blog.adnannoon.com/tag/access-pixel-values-of-opencv-image)。 –

答えて

3

あなたはやってcvGet2D()を使用することができます。

CvScalar val = cvGet2D(img, y, x); 

あなたはCvScalarから印刷したい値を引き出す必要があります。基本的にはdouble[4]なので、問題ではないと思います。

2

チェックアウトthis OpenCV FAQ。具体的には、「マトリックス要素へのアクセス方法」を参照してください。セクション。ここで

は私がきちんと印刷フロート IplImage構造のために書いた小さなサンプルです:

void fillIplImage(IplImage* srcdst) 
{ 
    for(int row = 0; row < srcdst->height; row++) 
    { 
     for(int col = 0; col < srcdst->width; col++) 
     { 
      ((float*)(srcdst->imageData + srcdst->widthStep*row))[col] = (float)col; 
     } 
    } 
} 

void printIplImage(const IplImage* src) 
{ 
    for(int row = 0; row < src->height; row++) 
    { 
     for(int col = 0; col < src->width; col++) 
     { 
      printf("%f, ", ((float*)(src->imageData + src->widthStep*row))[col]); 
     } 
     printf("\n"); 
    } 
} 

int main(int argc, char** argv) 
{ 
    CvSize sz = {10, 10}; 
    IplImage* test = cvCreateImage(sz, IPL_DEPTH_32F, 1); 

    fillIplImage(test); 
    printIplImage(test); 

    cvReleaseImage(&test); 
    return 0; 
} 

あり、シングルチャンネル画像のために動作しますCV_MAT_ELEM(matrix, elemtype, row, col)マクロでもあるが、それは本質的のための短期手ですすべてのポインタ演算。

関連する問題