【发布时间】:2013-10-24 12:20:11
【问题描述】:
我正在编写一个代码,我在其中读取、成像和处理它并获得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,这是真正的值。
我的问题是为什么我在使用 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()代码。 -
我添加了读写代码
标签: c++ opencv floating-point release-mode debug-mode