帧差分

一个物体在视频中移动时,意味着这个物体在每一个连续的帧上都处于不同的位置。

假设在一对连续的帧中除了该目标之外,没有其他物体移动,那么第一帧与第二帧的像素差将突出显示移动目标的像素,从而我们可以得到移动物体的像素和坐标。这就是帧差分法的工作原理。

故帧差分 常用于 运动目标识别

 

优点

算法简单

对光线等场景变换不太敏感,稳定性较好

缺点

无法提取出对象的完整区域,对象内部有 空洞,且边界比较粗糙;

对快速运动的 物体,容易出现 糊影 的现象;

对慢速运动的 物体,可能检测不到物体,此时可 跳帧 检测

 

划痕检测

import cv2
import numpy as np


'''
1.对原图进行中值滤波,相当于消除划痕,原图记为img1,新图记为img2
2.两张图进行差分,即做差,得到划痕,记为 img3
3.对img3进行灰度化,二值化
4.轮廓检测,如果轮廓较大,视为划痕
'''

print(cv2.__version__)
minThres = 6

# 读取图像1
img1 = cv2.imread('huahen.png')
img2 = cv2.imread('huahen.png')

# 中值滤波
img1 = cv2.medianBlur(img1, 15)

# 图像差分
diff = cv2.absdiff(img1, img2)
cv2.imshow('diff', diff)  # 结果图

gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
# 二值化
_, thres = cv2.threshold(gray, minThres, 255, cv2.THRESH_BINARY)
cv2.imshow('thres', thres)

# 查找轮廓
contours, hierarchy = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# 输出轮廓个数
print(len(contours))

for i in range(0, len(contours)):
    length = cv2.arcLength(contours[i], True)
    # 通过轮廓长度筛选
    if length > 30:
        cv2.drawContours(img2, contours[i], -1, (0, 0, 255), 2)

cv2.imshow('result', img2)  # 结果图
cv2.waitKey(0)
cv2.destroyAllWindows()

下图 第一张 是原图,最后一张是 划痕检测 结果

  

  

 

视频中检测车辆

首先利用 帧差分 原理 识别 运动的物体;

然后利用 二值化、形态学处理、轮廓检测 一系列操作,获得车辆的位置,【注意 这里只是根据 轮廓 判断是车的,没有用到如深度学习之类的识别算法】

 

 

 

 

 

 

参考资料:

https://zhuanlan.zhihu.com/p/165125200    用OpenCV和Python构建车辆检测

https://www.bilibili.com/video/BV1E34y1W7U5?p=86&vd_source=f0fc90583fffcc40abb645ed9d20da32    b站视频讲解