2012-01-21 36 views
1

我一直试图打印像素值在屏幕上使用printf在C中的OpenCV,但我只是得到垃圾值。如何将IPL_DEPTH_8U(8位无符号整数)图像打印到屏幕并将IPL_DEPTH_32F(32位浮点)图像打印到屏幕上?贝娄是我使用的代码。这是错的吗?这可能是正确的,但我只是得到的像素值我没有预料到:从opencv图像打印像素值到屏幕

这些都是单通道的图像BTW:

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)宏将只适用于单路图像,但它本质上是一个短手所有的指针算术。