我目前正在研究基于视频监控的入侵系统.为了完成这个任务,我拍摄了我的场景背景的快照(假设它完全干净,没有人或移动物体).然后,我比较从(静态)摄像机获得的帧并寻找差异.我必须能够检查任何差异,不仅是人的形状或其他什么,所以我不能具体提取特征.
通常,我有:
我正在使用OpenCV,所以要比较我基本上做的:
cv::Mat bg_frame;
cv::Mat cam_frame;
cv::Mat motion;
cv::absdiff(bg_frame, cam_frame, motion);
cv::threshold(motion, motion, 80, 255, cv::THRESH_BINARY);
cv::erode(motion, motion, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3)));
Run Code Online (Sandbox Code Playgroud)
结果如下:
正如你所看到的那样,手臂被剥离了(由于我猜的颜色差异冲突),这很遗憾不是我想要的.
我想添加使用cv::Canny()以检测边缘并填充手臂的缺失部分,但遗憾的是(再一次),它只解决了少数情况下的问题,而不是大多数情况.
我可以使用任何算法或技术来获得准确的差异报告吗?
PS:对不起图片.由于我的新订阅,我没有足够的声誉.
编辑 我在这里使用灰度图像,但我对任何解决方案都持开放态度.
我正在使用以下代码来匹配两个图像的冲浪特征,但无法裁剪和对齐图像。
原始图像-旋转图像和匹配图像如下。

我想像原始图像一样将旋转后的图像拉直,并裁剪出直线对齐的图像。我尝试了几何变换,但无法对齐图像。
import numpy
import cv2
############### Image Matching ###############
def match_images(img1, img2):
"""Given two images, returns the matches"""
detector = cv2.SURF(400, 5, 5)
matcher = cv2.BFMatcher(cv2.NORM_L2)
kp1, desc1 = detector.detectAndCompute(img1, None)
kp2, desc2 = detector.detectAndCompute(img2, None)
raw_matches = matcher.knnMatch(desc1, trainDescriptors = desc2, k = 2)
kp_pairs = filter_matches(kp1, kp2, raw_matches)
return kp_pairs
def filter_matches(kp1, kp2, matches, ratio = 0.75):
mkp1, mkp2 = [], []
for m in matches:
if len(m) == 2 and m[0].distance < m[1].distance * ratio: …Run Code Online (Sandbox Code Playgroud)