0

我对 OpenCv 中的这个问题感到抓狂。我必须读取原始图像,将其保存为二进制文件中的数组,并将其保存在 opencv 中准备的 cvMat 结构中。我做到了,而且似乎可行,我可以访问数据。但我无法绘制它。它显示为许多对角线。我已经在数据矩阵中打印了数字,并且似乎是正确的,只是有时会出现一些 0。这告诉我带有“步骤”字段的东西正在运行,但我不知道。

我在这里写了我的代码,我希望你们中的一些人明白发生了什么。提前非常感谢!我的天啊。

#include <stdio.h>//printf;fread...
#include <stdlib.h>//malloc,calloc ...
#include <cv.h>
#include <highgui.h>
// READING IMAGES
int read_raw_image(FILE* filehandler,float*** datamatrix,int* height,int* width);
//THIS READ THE RAW FILE SAVING THE DATA IN A MATRIX [HEIGHT][WIDTH]
char image_file[]="IR.raw";
CvMat image;

//RUBBISH FOR READ THE IMAGE
FILE *Fimage;
int height,width;
float **pimage=(float**)malloc(sizeof(float**));
if((Fimage=fopen(image_file,"rb"))!= NULL)
{
    printf("\n\tFile: %s was opened correctly\n",image_file);
    read_raw_image(Fimage,&pimage,&height,&width);
    fclose(Fimage);
}
else {printf("\n\tFile: %s wasn't opened correctly\n",image_file);return 0;}

//NOW THE PROBLEM
image=cvMat(height,width,CV_32FC1,*pimage);//HEIGHT=640; WIDTH=480; THE NUMBERS ARE FLOATS
printf("%i",image.step);//THE NUMBER GIVEN IS 1920 (480*4)
int i,j;
for(j = 0;j<2;j++)//print just two rows
{
    for(i = 0;i<480;i++)
{
    printf("%f\n",cvmGet(image,j,i));/The numbers showed are well, except some 0's in the middle
        if(*(Aux->data.fl+(j*640)+i)<10)
    {
      printf("piiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\n");//MAKE EASY TO SEE THE 0'S
    }
}
     printf("fila:%i\n",j);//Print the number of row at the end
}
 //AND NOW PLOT IT!
cvNamedWindow("win1",CV_WINDOW_AUTOSIZE);
cvShowImage("win1",&image);
cvWaitKey(0);
return 0;

我不知道 image.step 值有什么问题。我测试改变它。当我添加更多时,一些 0 消失了,但图像也没有打印出来。

谢谢你的帮助。我的天啊

PD:剧情……我不能发图!

4

1 回答 1

0

多亏了 Dimitar,我终于实现了解决方案。由于某种原因,每行都以浮点 0 结尾,这在每行中产生了偏移,在图中表示为四个黑点。由于现在每条线都被置换了,结果是置换了 4 个黑点,这似乎是一条对角线。最后对这个0的解释应该是我将数组(它没有出现在代码中)保存为二维动态分配数组的方式,首先我分配了行数,然后分别分配了每一行。但是,保存图像的最佳方式是在一维数组中,只分配一次。当您将其放入 cvMat 或 IplImage 时,代码仅在知道行数、列数和步长(每行的字节长度)的情况下按行和列运行。另外,如果我将原始问题中的步骤更改为 16 字节,我得到的 0 没有被取代,并且作为一个黑色的柱子站在右边。同样重要的是要注意原始文件,对于红外摄像机,阵列中的数字必须缩放到 0 到 1 的比例才能表示为灰度图。谢谢大家的帮助。

于 2012-09-03T07:07:13.040 回答