Python OpenCV识别行人入口进出人数统计
作者:alicema1111 发布时间:2023-09-18 13:08:06
标签:OpenCV,人数统计
前言
这篇博客针对《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.运行结果如下:
来源:https://blog.csdn.net/alicema1111/article/details/128407152
0
投稿
猜你喜欢
- 前言在自学机器学习或者是深度学习的过程中,有的时候总想把执行过程或者执行结果显示出来,所以就想到了动画。好在用 Python 实现动画有许多
- read()方法读取文件size个字节大小。如果读取命中获得EOF大小字节之前,那么它只能读取可用的字节。语法以下是read()
- 1 引言在进行图像处理过程中,我们经常会遇到一些和物体轮廓相关的操作,比如求目标轮廓的周长面积等,我们直接使用Opencv的findCont
- 1、时间戳转换为指定格式日期import timet = time.strftime("%Y-%m-%d %H:%M:%S&quo
- 在本文中,我将分享五个 Jupyter 扩展来提大家的工作效率。 欢迎收藏学习,喜欢点赞支持。技术交流群文末提供,欢迎畅聊。让我们开始吧!1
- 本文实例讲述了Python实现读取txt文件中的数据并绘制出图形操作。分享给大家供大家参考,具体如下:下面的是某一文本文件中的数据。6.11
- 需求:对于一个python list 或者numpy数组,我需要找到这个list中最大的K个数及其对应的下标。解决方式:1. 可以构造字典通
- 一、常见的匹配规则二、常见的匹配方法1、match()match()方法从字符串的起始位置开始匹配,该方法有两个参数,第一个是正则表达式,第
- 本文实例讲述了python中for语句简单遍历数据的方法。分享给大家供大家参考。具体如下:for name in ["kak&qu
- 本文较为详细的罗列了Python常见的异常处理,供大家参考,具体如下:1. 抛出异常和自定义异常Python用异常对象(exception
- “深入认识Python内建类型”这部分的内容会从源码角度为大家介绍Python中各种常用的内建类型。
- 可实现类似于sql中的dateadd、datesub的功能两种获取日期的方式z=datetime.datetime(2016,12,5)z=
- 我就废话不多说了,大家还是直接看代码吧~print(np.shape(X))#(1920, 45, 20)X=sequence.pad_se
- 本节重点让学生了安装上Python,配置好环境变量Python目前已支持所有主流操作系统,在Linux,Unix,Mac系统上自带Pytho
- 本文介绍了网页运行代码框(runCode), 复制代码框(copyCode), 保存代码框(saveCode),的实现方法。javascri
- 简介Simon Willison来自英国,是一名经验丰富的开发人员。曾工作于Yahoo,是Web开发框架Django的创始人之一,也是Ope
- 导言作为web开发人员,我们的生活围绕着数据操作。我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据。本文是研究在A
- 本文也是开发项目中的一个小经验Tip,虽然很简单,但对很多朋友也有小帮助。我们实际工程中,可能遇到开发环境、预上线环境、线上环境等环境场景,
- overflow:hidden 用在div上时很好用,但直接用在td上,好像没有任何效果。td中的文本过长时依然自动换了一行像下面这要设定一
- 本文章是建立在已经安装MySQL数据库的前提,默认安装在C:\Program Files (x86)\MySQL,建议在安装时选中Conne