0

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

#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;
}
4

2 回答 2

0

您确定将图像数据加载为 32 位浮点数吗?尝试按照此处所述显式转换它

于 2012-05-09T23:52:25.113 回答
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;
}

如果M是 var 类型Mat,您可以这样称呼它:

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

将输出如下数据:

Matrix: 8UC3 640x480 
Matrix: 64FC1 3x2 
于 2014-02-10T20:38:36.770 回答