php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 504|回复: 0

opencv车辆检测系统

[复制链接]

3146

主题

3156

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7966
贡献
0
注册时间
2021-4-14
最后登录
2024-11-23
在线时间
763 小时
QQ
发表于 2022-8-5 13:04:01 | 显示全部楼层 |阅读模式
[mw_shl_code=python,true]import cv2
import numpy as np

cap = cv2.VideoCapture('video.mp4')
bg = cv2.bgsegm.createBackgroundSubtractorMOG()
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
min_w = 90
min_h = 90
#检测线的高度
line_high = 550
#线的偏移量
offset = 7
#统计车的数量
carno = 0
#存放有效车辆数组
cars = []
#定义中心点
def center (x, y, w, h):
    x1 = int(w/2)
    y1 = int(h/2)
    cx = x + x1
    cy = y + y1
    return cx, cy

#循环去读取视频中的每一帧 视频是由一幅幅图画组成的
while True:
    #ret判断读取视频的帧是否成功了,成功了还返回另一个值frame
    ret, frame = cap.read()
    if (ret == True):
        #灰度化
        cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        #高斯去噪
        blur = cv2.GaussianBlur(frame, (3, 3), 5)
        #去背景
        mask = bg.apply(blur)
        #腐蚀:去除小斑块
        erode = cv2.erode(mask, kernel)
        #膨胀:还原
        dilate = cv2.dilate(erode, kernel, iterations = 3)
        #闭操作,去掉物体内部的小块
        close = cv2.morphologyEx(dilate, cv2.MORPH_CLOSE, kernel)
        close = cv2.morphologyEx(close, cv2.MORPH_CLOSE, kernel)

        cnts, h = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        #绘制检测线
        cv2.line(frame, (10, line_high), (1200, line_high), (255,255,0), 3)

        for (i, c) in enumerate(cnts):
            (x,y,w,h) = cv2.boundingRect(c)


            #对车辆的宽高进行判断 以验证是否是有效车辆
            isValid = (w >= min_w) and (h >= min_h)
            if (not isValid):
                continue

            #到这里都是有效的车
            #找车轮廓的中心线,过了线计数,未过线
            # 存放车轮廓数组
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
            cpoint = center(x, y, w, h)
            cars.append(cpoint)

            for (x, y) in cars:
                # 要有一条线 有范围(6个像素) 从数组中间去
                if ((y < line_high + offset) and (y > line_high - offset)):
                    carno +=1
                    cars.remove((x, y))
                    print(carno)
        cv2.putText(frame, "Cars Counts:" + str(carno), (500,60),
                    cv2.FONT_HERSHEY_SIMPLEX, 2, (255,0,0), 5)
        cv2.imshow("video", frame)

    else:
        break


    key = cv2.waitKey(1)
    if(key == 27):
        break


cap.release()
cv2.destroyAllWindows()


[/mw_shl_code]

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-23 18:00 , Processed in 0.261212 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表