• OpenCV4【25】帧差分 实现 划痕检测 和 视频中的 车辆检测


    帧差分

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

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

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

     

    优点

    算法简单

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

    缺点

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

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

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

     

    划痕检测

    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站视频讲解

  • 相关阅读:
    leetcode 92. 反转链表 II
    leetcode记录1 快速排序
    Jmeter入门总结
    Jmeter 元件作用域、集合点、检查点
    Jmeter 实例
    badboy脚本开发
    Jmeter 常用功能介绍
    简单的自创线程池
    多线程
    IO多路复用
  • 原文地址:https://www.cnblogs.com/yanshw/p/16454738.html
Copyright © 2020-2023  润新知