我正在尝试打印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;
}
答案 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;
}
如果M
是Mat
类型的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