使用 OpenCV abs() 稳定帧差异,非重叠区域除外

stabilized frame differencing using OpenCV abs() except for nonoverlapped areas

我有一系列移动相机的帧。框架已经稳定。我想计算每两个后续帧之间的帧差。我使用

diff = abs(frame1 - frame2);

框架是 Mat 对象。但是,这两帧会有不重叠的区域(即两帧的两个像素值之一将等于 0),我不想包括在内。 如果两个像素值是 a (= 0)b (!= 0),那么 abs() 将是 |b|,但如果两个像素之一为 0,我想取值为 0。

编辑: 我想在不遍历像素的情况下做到这一点

好的,我明白了。基本上,我们对AB这两个帧进行阈值处理,将它们转换为二值图像(threshold值=0,THRESH_BINARY模式),然后将这两个二值图像AND 运算,然后将结果与差分帧进行 AND 运算得到最终结果。

cv::Mat frameDifference(cv::Mat A, cv::Mat B)
{
  cv::Mat diff = cv::abs(A - B),
          binaryA,
          binaryB,
          binaryAND;

  cv::threshold(A, binaryA, 0, 256, cv::ThresholdTypes::THRESH_BINARY);
  cv::threshold(B, binaryB, 0, 256, cv::ThresholdTypes::THRESH_BINARY);
  cv::bitwise_and(binaryA, binaryB, binaryAND);
  cv::bitwise_and(diff, binaryAND, diff);

  return diff;
}