[英]Visual Studio Release and Debug difference
我正在編寫一個代碼,在其中讀取和成像並處理它,並獲得Mat of double/float
的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
使用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);
}
提前致謝,
首先,您不能在一個cv::Mat
使用float
和double
,因為存儲本身只是字節數組。 對於float
矩陣和double
矩陣,此數組的大小將有所不同。
因此,您必須決定要使用什么。
本質上, data.at<type>(x,y)
等效於(type*)data_ptr[x][y]
(請注意,這不是確切的代碼,其目的是顯示正在發生的事情)
編輯:在您添加的代碼的基礎上,您正在創建CV_32F
矩陣,這意味着您必須使用float
來進行讀寫和元素。 使用double會導致重新解釋價值,並且肯定會給您錯誤的結果。
關於斷言,我確定在cv::MAT::at<class T>
有一種以下代碼:
assert(sizeof<T>==this.getDepth());
通常,僅在DEBUG
模式下編譯斷言,因此這就是為什么您不在RELEASE
給出此錯誤的原因。
EDIT2:不考慮發布,但切勿將free()
與new
一起使用,或delete
與malloc()
。 結果可能是很難調試的問題。
因此,請使用delete[]
作為緩沖區。
調試和發布之間的區別:
您的代碼中有一個錯誤。 它只是沒有顯示在發布模式下。 這就是調試器的用途。 調試器會告訴您代碼中是否有任何錯誤/問題,Release會一直通過它運行...此外,編譯器還會優化您的代碼以使其運行更快,因此更小,調試器在HD上使用更大的大小,因為您實際上可以對其進行調試。
Release將未初始化的變量初始化為0。這可能在不同的編譯器上有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.