使用 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。
编辑:
我想在不遍历像素的情况下做到这一点
好的,我明白了。基本上,我们对A
和B
这两个帧进行阈值处理,将它们转换为二值图像(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;
}
我有一系列移动相机的帧。框架已经稳定。我想计算每两个后续帧之间的帧差。我使用
diff = abs(frame1 - frame2);
框架是 Mat 对象。但是,这两帧会有不重叠的区域(即两帧的两个像素值之一将等于 0),我不想包括在内。
如果两个像素值是 a (= 0)
和 b (!= 0)
,那么 abs()
将是 |b|,但如果两个像素之一为 0,我想取值为 0。
编辑: 我想在不遍历像素的情况下做到这一点
好的,我明白了。基本上,我们对A
和B
这两个帧进行阈值处理,将它们转换为二值图像(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;
}