Python OpenCV识别行人入口进出人数统计
生活随笔
收集整理的這篇文章主要介紹了
Python OpenCV识别行人入口进出人数统计
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?程序示例精選
Python OpenCV識別行人入口進出人數統計
如需安裝運行環境或遠程調試,見文章底部微信名片,由專業技術人員遠程協助!
前言
這篇博客針對《Python OpenCV識別行人入口進出人數統計》編寫代碼,功能包括了入口行人識別,人數統計。代碼整潔,規則,易讀。應用推薦首選。
文章目錄
????????一、所需工具軟件
????????二、使用步驟
????????????????1. 引入庫
????????????????2.?識別特征圖像
? ? ? ? ? ? ? ? 3. 運行結果
?????????三、在線協助
一、所需工具軟件
??????????1. Python3.6以上
??????????2. Pycharm代碼編輯器
? ? ? ? ? 3. OpenCV, Numpy庫
二、使用步驟
1.引入庫
代碼如下(示例):
#導入需要的包 import numpy as np import cv2 import Person import time2.識別特征圖像
代碼如下(示例):
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=Trueif cy in range(up_limit,down_limit):for i in persons:if abs(cx-i.getX())<=w and abs(cy-i.getY())<=h:new=Falsei.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/40print("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 += 1print("進入的總人數為:") print(cnt_in) print("出去的總人數為:") print(cnt_out) video.release(); cv2.destroyAllWindows()3.運行結果如下:?
三、在線協助:?
如需安裝運行環境或遠程調試,見文章底部微信名片,由專業技術人員遠程協助!
總結
以上是生活随笔為你收集整理的Python OpenCV识别行人入口进出人数统计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装和使用 ubuntu 服务器
- 下一篇: ajax的主要核心对象,简单谈谈AJAX