使用OpenCV abs()进行稳定的帧差分,但非重叠区域除外

时间:2017-01-05 05:55:45

标签: c++ opencv background-subtraction

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

做的
diff = abs(frame1 - frame2);

框架是Mat对象。然而,这两个帧将具有不重叠的区域(即,两个帧的两个像素值中的一个将等于0),我不想包括这些区域。 如果两个像素值为a (= 0)b (!= 0),则abs()将为| b |,但如果两个像素中的一个为0,我希望将值设为0。 / p>

编辑: 我想这样做而不会在像素上循环

1 个答案:

答案 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;
}