CUDA版OpenCVで差分絶対値の計算
OpenCVのC++とCUDAで2個の画像間の引き算からの絶対値を計算させていて想定通りの結果にならなかったのでメモ。
C++では
result = abs(image1 - image 2); // 全て変数はMat
として計算させていたので、CUDAでは
cv::cuda::subtract(image1, image2, result);// 全て変数はGpuMat
cv::cuda::abs(result, result);
として実装してみたら、結果はCPUとCUDAで
と相当違う結果が得られてしまった。デバッグしてみると絶対値計算を外すとほぼ同じ結果が得られている様に見えるので、絶対値計算で何か問題発生して違いが出た様子。
(9/30修正:再確認したら絶対値計算を外しても変わらず、差分計算に違いの要因があるようだ)
CUDA版のOpenCVのDocsを調べてみると差分と絶対値を同時に行うcv::cuda::absdiff()なる関数が用意されているので、とりあえずCUDAのコードを
cv::cuda::absdiff(image1, image2, result);
としてみたら、
とほぼ同じ結果が得られるようになったので、とりあえずめでたしめでたし。。。ではあるのだがこの違いが発生する理由が知りたい。。。。理由として考えられるのは
当たりであろうか。。。。