Python OpenCV识别行人入口进出人数统计

 更新时间:2023年01月06日 08:23:55   作者:alicema1111  
本文主要介绍了Python OpenCV识别行人入口进出人数统计,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>

前言

这篇博客针对《Python OpenCV识别行人入口进出人数统计》编写代码,功能包括了入口行人识别,人数统计。代码整洁,规则,易读。应用推荐首选。

一、所需工具软件

1. Python3.6以上
2. Pycharm代码编辑器
3. OpenCV, Numpy库

二、使用步骤

1.引入库

代码如下(示例):

#导入需要的包
import numpy as np
import cv2
import Person
import time

2.识别特征图像

代码如下(示例):

video=cv2.VideoCapture("counting_test.avi")
#输出视频
fourcc = cv2.VideoWriter_fourcc(*'XVID')#输出视频制编码
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
 
w = video.get(3)
h = video.get(4)
print("视频的原宽度为:")
print(int(w))
print("视频的原高度为:")
area = h*w
print(int(h))
areaTHreshold = area/500
print('Area Threshold', areaTHreshold)
 
#计算画线的位置
line_up = int(1*(h/4))
line_down = int(2.7*(h/4))
up_limit = int(.5*(h/4))
down_limit = int(3.2*(h/4))
print ("Red line y:",str(line_down))
print ("Green line y:", str(line_up))
 
pt5 = [0, up_limit]
pt6 = [w, up_limit]
pts_L3 = np.array([pt5,pt6], np.int32)
pts_L3 = pts_L3.reshape((-1,1,2))
pt7 =  [0, down_limit]
pt8 =  [w, down_limit]
pts_L4 = np.array([pt7,pt8], np.int32)
pts_L4 = pts_L4.reshape((-1,1,2))
#背景剔除
# fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True)
fgbg = cv2.createBackgroundSubtractorKNN()
#用于后面形态学处理的核
kernel = np.ones((3,3),np.uint8)
kerne2 = np.ones((5,5),np.uint8)
kerne3 = np.ones((11,11),np.uint8)
 
while(video.isOpened()):
    ret,frame=video.read()
    if frame is None:
        break
    #应用背景剔除
    gray = cv2.GaussianBlur(frame, (31, 31), 0)
    #cv2.imshow('GaussianBlur', frame)
    #cv2.imshow('GaussianBlur', gray)
    fgmask = fgbg.apply(gray)
    fgmask2 = fgbg.apply(gray)
 
    try:
        #***************************************************************
        #二值化
        ret,imBin= cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY)
        ret,imBin2 = cv2.threshold(fgmask2,200,255,cv2.THRESH_BINARY)
        #cv2.imshow('imBin', imBin2)
        #开操作(腐蚀->膨胀)消除噪声
        mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN, kerne3)
        mask2 = cv2.morphologyEx(imBin2, cv2.MORPH_OPEN, kerne3)
        #闭操作(膨胀->腐蚀)将区域连接起来
        mask =  cv2.morphologyEx(mask , cv2.MORPH_CLOSE, kerne3)
        mask2 = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, kerne3)
        #cv2.imshow('closing_mask', mask2)
        #*************************************************************
    except:
        print('EOF')
        print ('IN:',cnt_in+count_in)
        print ('OUT:',cnt_in+count_in)
        break
 
    #找到边界
    _mask2,contours0, hierarchy = cv2.findContours(mask2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours0:
        rect = cv2.boundingRect(cnt)#矩形边框
        area=cv2.contourArea(cnt)#每个矩形框的面积
        if area>areaTHreshold:
            #************************************************
            #moments里包含了许多有用的信息
            M=cv2.moments(cnt)
            cx=int(M['m10']/M['m00'])#计算重心
            cy=int(M['m01']/M['m00'])
            x, y, w, h = cv2.boundingRect(cnt)#x,y为矩形框左上方点的坐标,w为宽,h为高
            new=True
            if cy in range(up_limit,down_limit):
                for i in persons:
                    if abs(cx-i.getX())<=w and abs(cy-i.getY())<=h:
                        new=False
                        i.updateCoords(cx,cy)
                        if i.going_UP(line_down,line_up)==True:
                            # cv2.circle(frame, (cx, cy), 5, line_up_color, -1)
                            # img = cv2.rectangle(frame, (x, y), (x + w, y + h), line_up_color, 2)
                            if w>80:
                                count_in=w/40
                                print("In:执行了/60")
               time.strftime("%c"))
                        elif i.going_DOWN(line_down,line_up)==True:
                            # cv2.circle(frame, (cx, cy), 5, (0, 0, 255), -1)
                            # img = cv2.rectangle(frame, (x, y), (x + w, y + h), line_down_color, 2)
time.strftime("%c"))
                        break
                        #状态为1表明
                    if i.getState() == '1':
                        if i.getDir() == 'down' and i.getY() > down_limit:
                            i.setDone()
                        elif i.getDir() == 'up' and i.getY() < up_limit:
                            i.setDone()
                    if i.timedOut():
                        # 已经记过数且超出边界将其移出persons队列
                        index = persons.index(i)
                        persons.pop(index)
                        del i  # 清楚内存中的第i个人
                if new == True:
                    p = Person.MyPerson(pid, cx, cy, max_p_age)
                    persons.append(p)
                    pid += 1
 
print("进入的总人数为:")
print(cnt_in)
print("出去的总人数为:")
print(cnt_out)
video.release();
cv2.destroyAllWindows()

3.运行结果如下: 

到此这篇关于Python OpenCV识别行人入口进出人数统计的文章就介绍到这了,更多相关OpenCV人数统计内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 超实用的 10 段 Python 案例

    超实用的 10 段 Python 案例

    Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许多人广泛使用。它的简单和易用性造就了它如此流行的原因。今天这篇文章就给大家分享 10 段超级有用的 Python 案例,需要的朋友可以参考一下
    2021-09-09
  • python函数常见关键字分享

    python函数常见关键字分享

    这篇文章主要向大家介绍的是python函数常见关键字,文章基于python的相关资料展开对文章主题的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Python机器学习之随机梯度下降法的实现

    Python机器学习之随机梯度下降法的实现

    如果当我们数据量和样本量非常大时,每一项都要参与到梯度下降,那么它的计算量时非常大的,所以我们需要采用随机梯度下降法。本文介绍了Python实现随机梯度下降法的方法,希望对大家有所帮助
    2023-02-02
  • Python访问纯真IP数据库脚本分享

    Python访问纯真IP数据库脚本分享

    这篇文章主要介绍了Python访问纯真IP数据库脚本分享,本文直接给出实现代码,需要的朋友可以参考下
    2015-06-06
  • 快速创建python 虚拟环境

    快速创建python 虚拟环境

    这篇文章主要介绍了快速创建python 虚拟环境的方法,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-11-11
  • Python 取numpy数组的某几行某几列方法

    Python 取numpy数组的某几行某几列方法

    这篇文章主要介绍了Python 取numpy数组的某几行某几列方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 利用Python生成Excel炫酷图表

    利用Python生成Excel炫酷图表

    XlsxWriter是一个用来写Excel2007和xlsx文件格式的python模块。它可以用来写文本、数字、公式并支持单元格格式化、图片、图表、文档配置、自动过滤等特性。本文将用这个模块生成酷炫的Excel图表,需要的可以参考一下
    2022-02-02
  • python 实现二维字典的键值合并等函数

    python 实现二维字典的键值合并等函数

    今天小编就为大家分享一篇python 实现二维字典的键值合并等函数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • scrapy利用selenium爬取豆瓣阅读的全步骤

    scrapy利用selenium爬取豆瓣阅读的全步骤

    这篇文章主要给大家介绍了关于scrapy利用selenium爬取豆瓣阅读的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • python实现扫雷游戏的示例

    python实现扫雷游戏的示例

    这篇文章主要介绍了python实现扫雷游戏的示例,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-10-10

最新评论