0

私はOpenCvでこの問題に夢中になっています。生の画像を読み取り、バイナリファイルに配列として保存し、opencvで準備されたcvMat構造に保存する必要があります。私はそうしました、そしてそれはうまくいくようです、私はデータにアクセスすることができます。しかし、私はそれをプロットすることはできません。たくさんの対角線として表示されます。データマトリックスに数値を印刷しましたが、0が表示されることがあることを除けば、正しいようです。これは、「step」フィールドを持つ何かが実行されていることを教えてくれますが、私にはわかりません。

私が持っているコードをここに書きます。何が起こっているのかを理解してくれる人がいることを願っています。よろしくお願いします!ああ、神様。

#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つの黒い点として表されます。各線が移動したため、結果として4つの黒い点が移動し、対角線のように見えました。最後のこの0の説明は、配列を2D動的に割り当てられた配列として保存した方法(コードには表示されません)である必要があります。最初に行数を割り当て、後で各行を個別に割り当てました。ただし、画像を保存する最良の方法は、1D配列に1回だけ割り当てることです。それをcvMatまたはIplImageに入れると、コードは行数、列数、およびステップ(各行のバイト単位の長さ)を知っている場合にのみ行と列で実行されます。また、元の問題のステップを16バイト変更すると、変位していない0を取得し、右側に黒い列として立っています。また、生のファイルに注意することも重要です。IRカメラの場合、グレースケールプロットとして表示するには、配列内の数値を0から1のスケールにスケーリングする必要があります。皆様のご協力に感謝いたします。

于 2012-09-03T07:07:13.040 に答える