帧差分
一个物体在视频中移动时,意味着这个物体在每一个连续的帧上都处于不同的位置。
假设在一对连续的帧中除了该目标之外,没有其他物体移动,那么第一帧与第二帧的像素差将突出显示移动目标的像素,从而我们可以得到移动物体的像素和坐标。这就是帧差分法的工作原理。
故帧差分 常用于 运动目标识别。
优点
算法简单
对光线等场景变换不太敏感,稳定性较好
缺点
无法提取出对象的完整区域,对象内部有 空洞,且边界比较粗糙;
对快速运动的 物体,容易出现 糊影 的现象;
对慢速运动的 物体,可能检测不到物体,此时可 跳帧 检测
划痕检测
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站视频讲解