美文网首页
用OpenCV实现车流量计数

用OpenCV实现车流量计数

作者: pan_peter | 来源:发表于2024-04-16 09:55 被阅读0次
import cv2
import numpy

def center(x, y, w, h):
    x1 = int(w/2)
    y1 = int(h/2)
    cx = x + x1
    cy = y + y1
    return cx, cy


min_w = 90
min_h = 90

#检测线的高宽度
line_height = 550
line_wide1 = 10
line_wide2 = 1200
line_mid = (line_wide1+line_wide2)/2
#线的偏移量
offset = 6

carnum1 = 0
carnum2 = 0
cars = []

#引入视频文件
cap = cv2.VideoCapture('/Users/yangminghui/Downloads/yolov8_GUI-main/yolov8test.mp4')
winname = 'video'

bgsubmog = cv2.bgsegm.createBackgroundSubtractorMOG()
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

while True:
    ret, frame = cap.read()

    if(ret == True):

        #灰度化
        cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        #高斯去噪
        blur = cv2.GaussianBlur(frame, (3, 3), 5)
        #去背景
        mask = bgsubmog.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, (line_wide1, line_height),(line_wide2,line_height),(255, 255, 0))
        #cv2.line(frame, (300, 315), (889,250), (255, 0, 0), 5)

        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, 255, 0), 2)
            cpoint = center(x, y, w, h)#计算汽车中心点
            cars.append(cpoint)
            cv2.circle(frame, (cpoint), 5, (0, 0, 255), -1)
            for(x, y) in cars:# 遍历数组,如果车的中心点落在检测线的有效区域内,则计数+1,然后去除该数组
                print(y,line_height-offset,line_height+offset)
                if( (y > line_height - offset )and (y < line_height + offset))and(x<line_mid):
                    carnum1 += 1
                    cars.remove((x, y))
                    print(carnum1)
                if( (y > line_height - offset )and (y < line_height + offset))and(x>line_mid):
                    carnum2 += 1
                    cars.remove((x, y))
                    print(carnum2)
        text_lines = ["cars_in:"+str(carnum1),"cars_out:"+str(carnum2)]
        text_start_pos=(500,60)
        for i,text in enumerate(text_lines):
            y_height = text_start_pos[1]+ i*30
            cv2.putText(frame,text,(text_start_pos[0],y_height), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0),5)
        cv2.imshow('close', close)
        cv2.imshow(winname, frame)
    key = cv2.waitKey(1)
    if (key == 27):#esc键
        break
cap.release()
cv2.destroyAllWindows()

相关文章

  • OpenCV-Python教程:59.OpenCV-Python

    OpenCV-Python bindings是如何生成的 在OpenCV里,所有算法都是用C++实现的。但是这些算...

  • 9.20

    定时计数器,用占空比实现呼吸灯

  • OpenCV 之ios 实现自己的线性滤波器

    OpenCV 之ios 实现自己的线性滤波器 目的 本篇教程中,我们将学到: 用OpenCV函数 filter2D...

  • 用storm实现单词计数

    任务:通过storm 提交一个拓扑,strom的处理分几个部分,spout负责数据的不断输出,从spout往bol...

  • C++ opencv-3.4.1 物体计数

    使用opencv对简单物体进行计数,不使用深度学习的方法,如果使用深度学习的方法肯定比这个更加准确。直接就是用op...

  • Android引入OpenCV

    简介 在移动开发中,如果我们要实现一些图像处理相关的功能,难免要用到OpenCV。而OpenCV是用c++开发的。...

  • OpenCV提取图片的SIFT特征

    SIFT理论介绍 参考前面做的笔记:SIFT原理 用OpenCV实现SIFT特征提取 1.实现代码:

  • Mac下安装并使用OpenCV

    摘要:本文实现了用homebrew安装OpenCV,然后在terminal中用cmake编译一个简单的程序 不是用...

  • opencv案例--对象计数

    问题描述 真实案例,农业领域经常需要计算对象个数 或者在其它领域拍照自动计数,可以提供效率,减低成本 解决思路 通...

  • flume自定义拦截器学习

    备注:本文简单实现了一个计数功能的拦截器,针对每个event用线程安全的AtomicLong类进行计数,并将计数c...

网友评论

      本文标题:用OpenCV实现车流量计数

      本文链接:https://www.haomeiwen.com/subject/qeejxjtx.html