我对OpenCv中的这个问题感到疯狂。我必须读取一个原始图像,保存为二进制文件中的数组,并将其保存在opencv中准备的cvMat结构中。我做了,似乎工作,我可以访问数据。但我无法策划它。它看起来像很多对角线。我已经在数据矩阵中打印了数字,并且似乎是正确的,除了有时出现一些0。这告诉我'step'字段正在运行,但我不知道。
我在这里写下我的代码,希望你们中的一些人了解正在发生的事情。非常感谢提前! OMG。
#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的消失,但图像也没有打印。
感谢您的帮助。 OMG
P.D:情节......我无法发布图片!
答案 0 :(得分:0)
最后,我得到了Dimitar的解决方案。由于某种原因,每行以浮点0结束,这在每一行中产生了一个偏移,在图中表示为四个黑点。由于每条线现在都被移位,结果是一个移位的4个黑点,这似乎是一条对角线。最后对这个0的解释应该是我保存数组的方式(它没有出现在代码中)作为2D dinamically分配的数组,其中我首先分配行数,然后分隔每行。但是,保存图像的最佳方法是一维数组,只分配一次。当你把它放到cvMat或IplImage中时,代码只按行数,列数和步数(每行的字节长度)知道行和列。另外,如果我改变了原始问题中的步骤,则改为16字节,我得到0不是替换,并且在右边是黑色列。 同样重要的是要注意原始文件,并且在IR相机的情况下,数组中的数字必须按比例缩放到0比1,以便表示为灰度图。 感谢您的帮助。