首页 > 其他分享 >opencv笔记(车辆识别实现)

opencv笔记(车辆识别实现)

时间:2022-12-06 18:48:27浏览次数:42  
标签:kernel frame cv2 笔记 opencv 车辆 close line 识别

opencv笔记(车辆计数实现)

注意:更准确的车辆计数实现应考虑深度学习。

目录

基本实现思路

  1. 加载视频
  2. 通过形态学识别车辆
  3. 对车辆进行统计
  4. 显示车辆统计信息

涉及知识

  • 窗口展示
  • 图像/视频加载
  • 基本图形的绘制
  • 车辆识别
    • 基本图像运算与处理
    • 形态学
    • 轮廓查找

分步骤代码

加载视频

import cv2


# 创建窗口对象
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cap = cv2.VideoCapture('2.mp4')

while 1:
    ok, frame = cap.read()
    if ok:
        # 窗口显示
        cv2.imshow('video', frame)
        key = cv2.waitKey(1)
        if key == 27 or cv2.getWindowProperty('color', cv2.WND_PROP_VISIBLE) < 1.0:
            break
    else:
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

通过形态学识别车辆

import cv2

# 车辆过滤条件应根据参照物适配,此处仅为演示原理
min_w = 100
min_h = 100

line_high = 200
line_width = 6

cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)
cap = cv2.VideoCapture('6.ts')
bs = cv2.createBackgroundSubtractorMOG2()
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
cars = []
while 1:
    ok, frame = cap.read()
    if ok:
        # 转换绘图图
        cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 高斯去噪
        blur = cv2.GaussianBlur(frame, (3, 3), 5)
        # 去除背景
        mask = bs.apply(blur)
        # 腐蚀
        erode = cv2.erode(mask, kernel, iterations=2)
        # 膨胀
        dilate = cv2.dilate(erode, kernel, iterations=2)
        # 闭运算
        close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)
        close = cv2.morphologyEx(close, cv2.MORPH_CLOSE, kernel)

        # 查找轮廓
        contours, _ = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

        # 过滤、绘制轮廓,车辆计数
        for contour in contours:
            x, y, w, h = cv2.boundingRect(contour)
            # 过滤
            if w < min_w or h < min_h:
                continue
            # 绘制轮廓
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

        cv2.imshow('video', frame)
        key = cv2.waitKey(42)
        if key == 27:
            break
    else:
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

对车辆进行统计

import cv2

# 车辆过滤条件应根据参照物适配,此处仅为演示原理
min_w = 100
min_h = 100

# 检测线高度、误差
line_high = 190
line_offset = 5

cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)
cap = cv2.VideoCapture('6.ts')
bs = cv2.createBackgroundSubtractorMOG2()
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
car_count = 0
while 1:
    ok, frame = cap.read()
    if ok:
        # 转换绘图图
        cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 高斯去噪
        blur = cv2.GaussianBlur(frame, (3, 3), 3)
        # 去除背景
        mask = bs.apply(blur)
        # 腐蚀
        erode = cv2.erode(mask, kernel, iterations=3)
        # 膨胀
        dilate = cv2.dilate(erode, kernel, iterations=3)
        # 闭运算
        close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)
        close = cv2.morphologyEx(close, cv2.MORPH_CLOSE, kernel)
        # 查找轮廓
        contours, _ = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        # 绘制检测线
        cv2.line(frame, (0, line_high), (frame.shape[1], line_high), (255, 0, 0), 3)
        # 过滤、绘制轮廓,车辆计数
        for contour in contours:
            x, y, w, h = cv2.boundingRect(contour)
            # 过滤
            if w < min_w or h < min_h:
                continue

            # 搜集有效车辆(此处有逻辑限制:车辆不能停止于检测线区域内)
            center = y + h / 2
            if line_high - line_offset < center < line_high + line_offset:
                car_count += 1
                # 绘制轮廓
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv2.imshow('video', frame)
        key = cv2.waitKey(42)
        if key == 27:
            break
    else:
        break
# 释放资源
cap.release()
cv2.destroyAllWindows()

显示车辆统计信息

import cv2

# 车辆过滤条件应根据参照物适配,此处仅为演示原理
min_w = 100
min_h = 100

# 检测线高度、误差
line_high = 150
line_offset = 3

cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)
cap = cv2.VideoCapture('6.ts')
bs = cv2.createBackgroundSubtractorMOG2()
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
car_count = 0
while 1:
    ok, frame = cap.read()
    if ok:
        # 转换绘图图
        cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 高斯去噪
        blur = cv2.GaussianBlur(frame, (3, 3), 3)
        # 去除背景
        mask = bs.apply(blur)
        # 腐蚀
        erode = cv2.erode(mask, kernel, iterations=3)
        # 膨胀
        dilate = cv2.dilate(erode, kernel, iterations=3)
        # 闭运算
        close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)
        close = cv2.morphologyEx(close, cv2.MORPH_CLOSE, kernel)
        # 查找轮廓
        contours, _ = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        # 绘制检测线
        cv2.line(frame, (0, line_high), (frame.shape[1], line_high), (255, 0, 0), 3)
        # 过滤、绘制轮廓,车辆计数
        for contour in contours:
            x, y, w, h = cv2.boundingRect(contour)
            # 过滤
            if w < min_w or h < min_h:
                continue
            # 搜集有效车辆(此处有逻辑限制:车辆不能停止于检测线区域内,准确计数应该为每辆车提供唯一标识)
            center = y + h / 2
            if line_high - line_offset < center < line_high + line_offset:
                car_count += 1
                # 绘制轮廓
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        cv2.putText(frame, f'Cars: {car_count}', (300, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 0), 3)
        cv2.imshow('video', frame)
        key = cv2.waitKey(42)
        if key == 27:
            break
    else:
        break
# 释放资源
cap.release()
cv2.destroyAllWindows()

标签:kernel,frame,cv2,笔记,opencv,车辆,close,line,识别
From: https://www.cnblogs.com/missfxy/p/16958108.html

相关文章

  • django学习笔记-ORM
    0.安装第三方模块pipinstallmysqlclient1.ORM1.1.创建数据库启动mysql服务自带工具创建数据库createdatabasedemo01DEFAULTCHARSETutf8COLLATEutf8_gene......
  • Canvas学习笔记(四)线条操作
    在Canvas中,常见的线条操作属性有:属性说明lineWidth定义线条宽度lineCap定义线帽样式lineJoin定义两个线条交接处的样式常见的线条操作方法有:方......
  • [笔记]docker-compose启动javaweb
    1.Dockfile1准备jdk安装包启动项目jar2文件fromcentosrunmkdir/var/tmp/jdkCOPYjdk-8u321-linux-x64.tar.gz/var/tmp/jdkRUNtarxzf/var/tmp/jdk/jdk-8......
  • Raft笔记
    内容参考自:解读共识算法Raft(1)简介和状态简化出自Lamport的《InSearchofanUnderstandableConsensusAlgorithm》1.Raft把共识算法分为三个子问题:LeaderElection、L......
  • (笔记)关于Typora提示”This beta version of Typora is expired...“的解决办法
      一、问题使用老版本Typora时,会提示下文,并跳转至typora官网,从而没有使用。  二、解决办法修改Typora相应注册表的权限(作为旧版本失效后的一种补充):打开......
  • UEC++ 会话暴露给蓝图 ,无法识别会话相关类型
    在实在联网功能时,我们常常需要获取到会话类型,当我们需要在蓝图中使用这些类型的时候。如果我们直接在头文件中直接使用会话相关类型在编译时就会报错Unrecognizedtype......
  • UML画图笔记
    提纲:1:面向对象技术2:模型与可视化建模3:什么是UML4:UML发展历史5:软件过程6:UML工具7:UML构成8:UML实例9:UML在软件开发各个阶段的应用。 一:面向对象技术二:软件质......
  • 操作系统笔记
    第一章一:什么是操作系统覆盖在硬件和操作软件中间的一个系统,和硬件部分相互作用,主要起一个承上启下的任务二:资源的管理者现代计算机支持多任务,多......
  • 操作系统笔记总结
    操作系统一:什么是操作系统覆盖在硬件和操作软件中间的一个系统,和硬件部分相互作用,主要起一个承上启下的任务二:资源的管理者现代计算机支持多任务,多个应用程序共同使用......
  • [个人学习笔记]卫生统计学R语言代码总结
    卫生统计学R语言代码总结目录前言不同分布相关函数统计描述数值变量集中位置离散程度正态性检验分类变量t检验方差分析假设检验两两比较秩和检验......