2015-05-04 42 views
0

爲了獲得視差圖的平均值,我不得不寫自己的方法忽略負差異值:GDB算術異常 - 不除以零 - 運行時錯誤

float Utility::calcMeanDisparity(cv::Mat const& matrix) 
{ 
    int total = 0; 
    int numElements = 0; 
    for(int r = 0; r < matrix.rows; ++r) 
    { 
    for(int c = 0; c < matrix.cols; ++c) 
    { 
     if(static_cast<float>(matrix.at<short>(r,c)) > 0) 
     { 
     total += static_cast<float>(matrix.at<short>(r,c)); 
     ++numElements; 
     } 
    } 
    } 
    float mean = total/abs(numElements); 
    std::cout << total << "/" << numElements << " = " << mean << std::endl; 
    return mean; 
} 

,但我的代碼只是崩潰經過一段時間後,與gdb的錯誤:

Program received signal SIGFPE, Arithmetic exception. 
0x000000000044a992 in Utility::calcMeanDisparity (matrix=...) at src/utility.cpp:250 
250 float mean = total/abs(numElements); 

但是我沒有辦法做一個零除法。這三個最後幾行我的代碼試圖計算:

950149/4275 = 222 
804412/4429 = 181 
873770/4253 = 205 

我還添加了abs(foo)東西零是完全安全的部門。

其實我現在還不知道該怎麼做。

也許你們中的一個人有一個想法。

+2

你能給我們一個[最小完整的例子](http://stackoverflow.com/help/mcve)嗎? – Beta

+0

我應該如何讓它更小?問題是程序在非課稅時間後崩潰。我給這個函數提供一個沒有標準化的視差圖。我無法提供更多信息,因爲我真的不知道那裏發生了什麼 – hGen

+0

gdb認爲'total'和'numElements'的值是什麼? –

回答

0

如果matrix.rowsmatrix.cols爲0,將包含numElements爲0,既然你似乎知道如何使用調試器,檢查的matrix.rows的價值觀和matrix.cols來驗證你將0

得到一個師原因。

0

感謝所有的幫助,但問題比預期的更容易。

視差圖中不時包含零/負值的區域。所以我傳入函數的整個子矩陣的平均值爲0,這就是爲什麼if條件被忽略。所以最後的分區是0/0 - >算術例外。