0

为了获得视差图的平均值,我必须编写自己的方法来忽略负视差值:

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)这些东西以完全安全地除以零。

其实我现在不知道该怎么做。

也许你们中的一个人对此有想法。

4

2 回答 2

0

如果matrix.rowsandmatrix.cols为 0,则 numElements 将为 0,您将得到除以 0。

由于您似乎知道如何使用调试器,因此请检查值matrix.rowsmatrix.cols验证原因。

于 2015-05-04T23:53:34.770 回答
0

感谢所有的帮助,但问题比预期的要容易。

视差图有时会包含零/负值的区域。所以我传递给函数的整个子矩阵的平均值为 0,这就是 if 条件被忽略的原因。所以最后的除法是0 / 0-->算术异常。

于 2015-05-05T12:36:05.250 回答