用python獲取教室人數(粗糙版)
阿新 • • 發佈:2019-01-31
最近在做一個有關教室視訊監控的專案,引用了一篇瀋陽大學畢業生的論文《基於監控視訊的高校教室佔有率統計系統》裡面的流程圖,這是一篇很好的論文,當然今天不是來說這篇論文的。
這是論文的下載地址:論文下載地址
下面就是自己寫的程式碼和對程式碼的解釋:
一、 程式碼內容:
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 21 00:28:44 2016
@author: #riel
"""
import cv2
import numpy as np
import argparse
def pmain(img):
def Key(*image) :
for i in image:
cv2.imshow('%s'%id(i),i)
k = cv2.waitKey(0) &0xFF
if k == ord('q'):
return True
return False
result = 0
dst = cv2.cvtColor(img,cv2.COLOR_BGR2HSV_FULL)
h,s,v = cv2.split(dst)
v = cv2.inRange(v,0,64)
# if Key(v):
# return result
blur = cv2.GaussianBlur(v,(5,5),0)
ret,thresh1 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
ret,thresh2 = cv2.threshold(blur,100,255,cv2.THRESH_BINARY)
# if Key(thresh1,thresh2):
# return result
kernel = np.ones((2,2),np.uint8)
erosion = cv2.erode(thresh2,kernel,iterations = 1 )
dilation = cv2.dilate(erosion,kernel,iterations = 1)
# if Key(dilation):
# return result
circles = cv2.HoughCircles(dilation,cv2.cv.CV_HOUGH_GRADIENT,1,5,param1=5,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
result = len(circles[0])
# for i in circles[0,:]:
# cv2.circle(dilation,(i[0],i[1]),5,(0,255,0),1)
# cv2.circle(dilation,(i[0],i[1]),1,(0,0,255),1)
# result = result + 1
# if Key(img,dilation):
# return result
return result
if __name__ == '__main__':
ap = argparse.ArgumentParser()
ap.add_argument("-p","--photo",help = "path to the photo file")
ap.add_argument("-a","--min-area",type = int,default = 500,help = "minimun area size")
args = vars(ap.parse_args())
if args.get("photo",None) is None:
strings = r"photo.jpg"
else :
strings = args["photo"]
img = cv2.imread(strings)
print pmain(img)
cv2.destroyAllWindows()
二、程式碼解釋:
1.獲取圖片:
ap = argparse.ArgumentParser()
ap.add_argument("-p","--photo",help = "path to the photo file")
ap.add_argument("-a","--min-area",type = int,default = 500,help = "minimun area size")
args = vars(ap.parse_args())
if args.get("photo",None) is None:
strings = r"photo.jpg"
else :
strings = args["photo"]
這裡獲取圖片分成兩種方法,第一種是用cmd執行程式碼,輸入圖片路徑,第二種則是使用程式碼中的已經設定好的圖片路徑:
圖中program’spath就是程式碼路徑
“-p”則是新增args引數,表示的是圖片的路徑photo’spath
2.Key函式,這個只是為了方便圖片的輸出而寫的一個函式,用系統給定的id作為視窗名字(好像沒有什麼好的方法直接呼叫引數的變數名作為視窗名字):
def Key(*image):
for i in image:
cv2.imshow('%s'%id(i),i)
k = cv2.waitKey(0) &0xFF
if k == ord('q'):
return True
return False
3、其餘的可以對照論文的流程來看,有什麼錯誤或者不懂歡迎私聊本人。
三、總結:
這個是直接利用了論文裡面的流程圖和指示寫的程式碼,對於自己做的專案有一些偏差,這說明了不是每個人的程式碼都可以直接拿過來用,首先是要去理解,然後根據自己的所需去改變,這樣才能把別人的東西變成自己的。
路途艱苦,天道酬勤。
注:本部落格為原創,若需轉載請註明出處。
注:若有侵權,請與本人聯絡刪部落格。