使用 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。
编辑: 我想在不循环像素的情况下做到这一点
【问题讨论】:
通过同时迭代frame1
和frame2
中的每个像素来创建diff
,并应用您提到的规则?您还没有给出frame1
或frame2
的类型,这对于试图给您提供超出广泛建议的任何人来说非常有用。
我想在不循环像素的情况下这样做。我添加了框架的类型(Mat)。谢谢。
【参考方案1】:
好的,我想通了。基本上,我们对A
和B
这两个帧进行阈值处理,以将它们转换为二值图像(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() 稳定帧差分,不重叠区域除外的主要内容,如果未能解决你的问题,请参考以下文章