2012-01-21 9 views
1

OpenCV에서 printf를 사용하여 화면의 픽셀 값을 계속 인쇄하려고하지만 가비지 값을 얻습니다. IPL_DEPTH_8U (8 비트 부호없는 정수) 이미지를 화면에 인쇄하고 IPL_DEPTH_32F (32 비트 부동 소수점) 이미지를 화면에 인쇄하려면 어떻게합니까? Bellow는 내가 사용하고있는 코드입니다. 잘못 됐나? 그것은 올바른 일 수 있지만, 난 그냥 내가 예상하지 않는 픽셀 값을 얻을 :opencv 이미지에서 화면에 픽셀 값 인쇄

이 단일 채널 이미지 BTW됩니다 : IPL_DEPTH_8U 이미지입니다, 나는 그것이 잘 작동 의심

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"); 
} 

. 32 float 이미지에 대해 포인터를 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) 매크로도 있지만, 본질적에 대한 짧은 손으로 모든 포인터 연산.

관련 문제