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);

しかし、ゼロ除算を行う方法はありません。これらは、私のコードが計算しようとしている最後の 3 行です。

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

abs(foo)また、ゼロによる除算を完全に安全にするためのものを追加しました。

実際、私は現時点で何をすべきかまったくわかりません。

多分あなたの一人はそれについての考えを持っています。

4

2 に答える 2

0

助けてくれたおかげで、問題は思ったより簡単でした。

時折、視差マップにはゼロ/負の値を持つ領域が含まれていました。そのため、関数に渡した部分行列全体の平均は 0 でした。これが if 条件が無視された理由です。したがって、最後の除算は0 / 0--> 算術例外でした。

于 2015-05-05T12:36:05.250 に答える