私はそれを読んで画像化し、処理してMat of double/float
. ファイルに保存し、後でそのファイルから読み取ります。
double を使用する場合、必要なスペースは 1Kx1K 画像で 8MB で、float を使用する場合は 4MB です。だから使いたいfloat
。
ここに私のコードと出力があります:
Mat data = readFloatFile("file_location");
cout << data.at<float>(0,0) << " " << data.at<double>(0,0);
このコードを で実行するとDEBUG mode
、float の出力は で-0
あり、double は例外、つまり を返しassertion failed
ます。しかし、RELEASE mode
float の出力を使用する-0
と、 double の場合は 0.832 になり、これは true valueです。
私の質問は、使用時に出力をdata.at<float>(0,0)
取得できない理由と、使用時に例外が発生しない理由data.at<double>(0,0) in RELEASE mode
です。
編集:これは、書き込みと読み取りを行う私のコードです
void writeNoiseFloat(string imageName,string fingerprintname) throw(){
Mat noise = getNoise(imageName);
FILE* fp = fopen(fingerprintname.c_str(),"wb");
if (!fp){
cout << "not found ";
perror("fopen");
}
float *buffer = new float[noise.cols];
for(int i=0;i<noise.rows;++i){
for(int j=0;j<noise.cols;++j)
buffer[j]=noise.at<float>(i,j);
fwrite(buffer,sizeof(float),noise.cols,fp);
}
fclose(fp);
free(buffer);
}
void readNoiseFloat(string fpath,Mat& data){
clock_t start = clock();
cout << fpath << endl;
FILE* fp = fopen(fpath.c_str(),"rb");
if (!fp)perror("fopen");
int size = 1024;
data.create(size,size,CV_32F);
float* buffer= new float[size];
for(int i=0;i<size;++i) {
fread(buffer,sizeof(float),size,fp);
for(int j=0;j<size;++j){
data.at<float>(i,j)=buffer[j];
cout << data.at<float>(i,j) << " " ;
cout << data.at<double>(i,j);
}
}
fclose(fp);
}
前もって感謝します、