簡體   English   中英

Visual Studio發行版和調試的區別

[英]Visual Studio Release and Debug difference

我正在編寫一個代碼,在其中讀取和成像並處理它,並獲得Mat of double/floatMat 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使用floatdouble ,因為存儲本身只是字節數組。 對於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一起使用,或deletemalloc() 結果可能是很難調試的問題。

因此,請使用delete[]作為緩沖區。

調試和發布之間的區別:

您的代碼中有一個錯誤。 它只是沒有顯示在發布模式下。 這就是調試器的用途。 調試器會告訴您代碼中是否有任何錯誤/問題,Release會一直通過它運行...此外,編譯器還會優化您的代碼以使其運行更快,因此更小,調試器在HD上使用更大的大小,因為您實際上可以對其進行調試。

Release將未初始化的變量初始化為0。這可能在不同的編譯器上有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM