mochirism’s blog

日頃のメモが主目的

CUDA版OpenCVで差分絶対値の計算

OpenCVC++とCUDAで2個の画像間の引き算からの絶対値を計算させていて想定通りの結果にならなかったのでメモ。

C++では

result = abs(image1 - image 2); // 全て変数はMat

として計算させていたので、CUDAでは

cv::cuda::subtract(image1, image2, result);// 全て変数はGpuMat

cv::cuda::abs(result, result);

 として実装してみたら、結果はCPUとCUDAで

f:id:mochirism:20150929235250p:plain

と相当違う結果が得られてしまった。デバッグしてみると絶対値計算を外すとほぼ同じ結果が得られている様に見えるので、絶対値計算で何か問題発生して違いが出た様子。

(9/30修正:再確認したら絶対値計算を外しても変わらず、差分計算に違いの要因があるようだ)

CUDA版のOpenCVのDocsを調べてみると差分と絶対値を同時に行うcv::cuda::absdiff()なる関数が用意されているので、とりあえずCUDAのコードを

cv::cuda::absdiff(image1, image2, result);

としてみたら、

f:id:mochirism:20150929235601p:plain

とほぼ同じ結果が得られるようになったので、とりあえずめでたしめでたし。。。ではあるのだがこの違いが発生する理由が知りたい。。。。理由として考えられるのは

  • subtract() → abs()とabsdiff()の計算内容がそもそも異なる。
  • abs()の第1、第2引数を同じresultを用いる事に問題がある。

当たりであろうか。。。。