试图打印32位浮点图像的像素值

时间:2012-05-09 23:37:16

标签: c opencv

我正在尝试打印32位浮点图像的像素强度。这是我正在使用的代码。通过在matlab,NAN和浮点上看到imread,图像中​​有两种类型的值。该程序加载图像但尝试运行时会挂起。任何人都可以建议我出了什么问题。谢谢你的帮助。

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

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

int main(int argc, char** argv)
{
    IplImage *t3 = cvLoadImage("divimages1.tiff",CV_LOAD_IMAGE_UNCHANGED);

    printIplImage(t3);

    cvReleaseImage (&t3);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

您确定图像数据是否以32位浮点数加载?试试converting it explicitly as described here

答案 1 :(得分:0)

如果首先检查已加载图像的数据类型,那将是一件好事。下面的代码可以帮助您了解数据类型。如果不是“浮动”格式,则 首先以自己的格式提取像素值,然后再进行类型转换 。我之前也遇到过类似的问题而且它帮了我。

这是一个方便的函数,可用于帮助在运行时识别opencv矩阵。我觉得它至少对调试很有用。

string type2str(int type) {
  string r;

  uchar depth = type & CV_MAT_DEPTH_MASK;
  uchar chans = 1 + (type >> CV_CN_SHIFT);

  switch ( depth ) {
    case CV_8U:  r = "8U"; break;
    case CV_8S:  r = "8S"; break;
    case CV_16U: r = "16U"; break;
    case CV_16S: r = "16S"; break;
    case CV_32S: r = "32S"; break;
    case CV_32F: r = "32F"; break;
    case CV_64F: r = "64F"; break;
    default:     r = "User"; break;
  }

  r += "C";
  r += (chans+'0');

  return r;
}

如果MMat类型的var,您可以这样调用它:

string ty =  type2str( M.type() );
printf("Matrix: %s %dx%d \n", ty.c_str(), M.cols, M.rows );

将输出数据,如:

Matrix: 8UC3 640x480 
Matrix: 64FC1 3x2