我正在編寫一個代碼,在該代碼中,我讀取並進行圖像處理並獲得Mat of double/float
。我將它保存到一個文件中,稍後,我正在從該文件中讀取它。Visual Studio版本和調試差異
當我使用double時,它需要的空間是8MB,對於1Kx1K圖像,當我使用float時,它是4MB。所以我想用float
。
這裏是我的代碼和輸出:
Mat data = readFloatFile("file_location");
cout << data.at<float>(0,0) << " " << data.at<double>(0,0);
當我運行在DEBUG mode
這段代碼,浮法打印出來是-0
和雙給人異常即assertion failed
。但是當我使用RELEASE mode
時,打印出的浮點數爲-0
和0.832,這是真值。
我的問題是爲什麼當我使用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);
}
感謝,
添加'readFloatFile()'代碼。 – Alex
我同時添加了讀寫代碼 – smttsp