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

Posted

技术标签:

【中文标题】使用 OpenCV abs() 稳定帧差分,不重叠区域除外【英文标题】:stabilized frame differencing using OpenCV abs() except for nonoverlapped areas 【发布时间】:2017-01-05 05:55:45 【问题描述】:

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

diff = abs(frame1 - frame2);

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

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

【问题讨论】:

通过同时迭代frame1frame2 中的每个像素来创建diff,并应用您提到的规则?您还没有给出frame1frame2 的类型,这对于试图给您提供超出广泛建议的任何人来说非常有用。 我想在不循环像素的情况下这样做。我添加了框架的类型(Mat)。谢谢。 【参考方案1】:

好的,我想通了。基本上,我们对AB 这两个帧进行阈值处理,以将它们转换为二值图像(threshold 值 = 0,THRESH_BINARY 模式),然后对这两个二值图像进行“与”运算,然后将结果进行“与”运算用不同的帧得到最终结果。

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;

【讨论】:

以上是关于使用 OpenCV abs() 稳定帧差分,不重叠区域除外的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV2帧间差分检测运动目标

android-opencv 应用程序的模板匹配

OpenCV C++ 多线程提高帧率

OpenCV 视频稳定

OpenCV warpPerspective 的问题

Opencv - 如何区分抖动和平移?