在當(dāng)今尖端技術(shù)的世界中,數(shù)字圖像處理發(fā)展非常迅速,并成為許多數(shù)字設(shè)備的重要組成部分,如手機(jī)、安全攝像頭、筆記本電腦等。
數(shù)字圖像處理最常見的應(yīng)用是對象檢測、人臉識別和人數(shù)統(tǒng)計(jì)。所以在本教程中,我們將使用 Raspberry Pi 和 ThingSpeak 構(gòu)建一個(gè) OpenCV 人群計(jì)數(shù)。在這里,pi 相機(jī)模塊將用于連續(xù)捕獲幀,然后將這些幀用HOG(面向直方圖的對象描述符)處理以檢測圖像中的對象。在此之后,這些幀將與 OpenCV 的預(yù)訓(xùn)練模型進(jìn)行比較以進(jìn)行人員檢測。人數(shù)統(tǒng)計(jì)將顯示在 ThingSpeak 頻道上,可以從世界任何地方進(jìn)行監(jiān)控。
所需組件
硬件
樹莓派 3(任何版本)
派相機(jī)
軟件和在線服務(wù)
物語
Python3.0
開放CV3.0
在樹莓派中安裝 OpenCV
這里將使用 OpenCV 庫來檢測人群。要安裝 OpenCV,首先,更新 Raspberry Pi。
sudo apt-get 更新
然后安裝在 Raspberry Pi 上安裝 OpenCV 所需的依賴項(xiàng)。
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –y sudo apt-get install libqt4-test –y
之后,使用以下命令在 Raspberry Pi 中安裝 OpenCV。
pip3 安裝 opencv-contrib-python==4.1.0.25
安裝其他必需的軟件包
在對 Raspberry Pi 進(jìn)行人群計(jì)數(shù)編程之前,讓我們安裝其他所需的軟件包。
安裝imutils: imutils 用于執(zhí)行一些必要的圖像處理功能,例如平移、旋轉(zhuǎn)、調(diào)整大小、骨架化,以及使用 OpenCV 更輕松地顯示 Matplotlib 圖像。因此,使用以下命令安裝imutils :
pip3 安裝 imutils
matplotlib:之后,安裝matplotlib庫。Matplotlib是一個(gè)綜合庫,用于在 Python 中創(chuàng)建靜態(tài)、動畫和交互式可視化。
pip3 安裝 matplotlib
人數(shù)統(tǒng)計(jì)的 ThingSpeak 設(shè)置
ThingSpeak 是一個(gè)非常流行的物聯(lián)網(wǎng)平臺,通過使用 ThingSpeak 平臺,我們可以從任何地方通過互聯(lián)網(wǎng)監(jiān)控我們的數(shù)據(jù)。
單擊 Sing up 并輸入您的詳細(xì)信息。
在此之后,驗(yàn)證您的電子郵件 ID,然后單擊繼續(xù)。
現(xiàn)在,登錄后,單擊“新建頻道”按鈕創(chuàng)建一個(gè)新頻道。
單擊“新頻道”后,輸入您要在此頻道上上傳的數(shù)據(jù)的名稱和描述。在這里,我們創(chuàng)建了一個(gè)名為People的字段??筛鶕?jù)需要創(chuàng)建多個(gè)字段。
在此之后,單擊保存頻道按鈕以保存詳細(xì)信息。
要將數(shù)據(jù)發(fā)送到 ThingSpeak,請?jiān)?Python 腳本中輸入 API 密鑰和通道 ID,然后復(fù)制 API 密鑰和通道 ID。
硬件設(shè)置
在這里,我們只需要 Raspberry Pi 和 Pi 相機(jī)來完成這個(gè)OpenCV 人員計(jì)數(shù)項(xiàng)目,您只需將相機(jī)帶狀連接器連接到 Raspberry pi 中提供的相機(jī)插槽中
Pi 攝像頭可用于構(gòu)建各種有趣的項(xiàng)目,如Raspberry Pi 監(jiān)控?cái)z像頭、訪客監(jiān)控系統(tǒng)、家庭安全系統(tǒng)等。
人員計(jì)數(shù)器的Python程序說明
此人群計(jì)數(shù) OpenCV 項(xiàng)目的完整 Python 代碼在頁面末尾給出。在這里,我們將解釋代碼的重要部分,以便更好地解釋。
因此,在代碼開始時(shí),導(dǎo)入將在此項(xiàng)目中使用的所有必需庫。
導(dǎo)入簡歷2 導(dǎo)入 imutils 從 imutils.object_detection 導(dǎo)入 non_max_suppression 將 numpy 導(dǎo)入為 np 導(dǎo)入請求 進(jìn)口時(shí)間 導(dǎo)入base64 從 matplotlib 導(dǎo)入 pyplot 作為 plt 從 urllib.request 導(dǎo)入 urlopen?
導(dǎo)入庫后,輸入 ThingSpeak 頻道 ID 并寫入您之前復(fù)制的 API 密鑰。
channel_id = 812060 # 在此處輸入頻道 ID WRITE_API = 'X5AQ3EGIKMBYW31H' # 把你的寫密鑰放在這里 BASE_URL = "https://api.thingspeak.com/update?api_key= {}".format(WRITE_API)
現(xiàn)在,初始化 HOG(面向直方圖的對象描述符)。HOG 是最流行的目標(biāo)檢測技術(shù)之一,并已在多個(gè)應(yīng)用中使用。cv2.HOGDescriptor_getDefaultPeopleDetector()用于調(diào)用 OpenCV 的預(yù)訓(xùn)練模型進(jìn)行人員檢測。我們之前在之前的 OpenCV 教程中詳細(xì)解釋過 HOG 。
豬 = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
在檢測器()內(nèi)部,Pi 接收到一個(gè) RGB 圖像,該圖像被分成三個(gè)顏色通道。之后,它使用imutils調(diào)整圖像大小。然后它調(diào)用detectMultiScale()方法來分析圖像,使用 SVM 模型的分類結(jié)果來了解是否存在人。
def檢測器(圖像): image = imutils.resize(image, width=min(400, image.shape[1])) 克隆 = image.copy() rects, weights = hog.detectMultiScale(image, winStride=(4, 4), padding=(8, 8), scale=1.05)
有時(shí)捕獲框重疊并產(chǎn)生誤報(bào)或檢測錯誤,因此下面的代碼將imutils的非最大抑制應(yīng)用于啟動重疊框。
對于矩形中的 (x, y, w, h): cv2.rectangle(圖像, (x, y), (x + w, y + h), (0, 0, 255), 2) rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects]) 結(jié)果 = non_max_suppression(rects,probs=None,overlapThresh=0.7) 返回結(jié)果
在record()函數(shù)中,它使用 OpenCV 中的VideoCapture()方法直接從 Pi 相機(jī)中檢索圖像,使用 imultis 調(diào)整圖像大小并將結(jié)果發(fā)送到 ThingSpeak。
def 記錄(sample_time=5): 相機(jī) = cv2.VideoCapture(0) frame = imutils.resize(frame, width=min(400, frame.shape[1])) 結(jié)果=檢測器(frame.copy()) thingspeakHttp = BASE_URL + "&field1={}".format(result1)
測試 OpenCV 人員計(jì)數(shù)器
在啟動 python 腳本之前,首先檢查您的 PI 相機(jī)是否工作。檢查相機(jī)后,通過發(fā)出以下命令啟動 python 腳本:
然后你會發(fā)現(xiàn)彈出一個(gè)窗口,里面有你的視頻源。Pi 將獲取第一幀并使用 OpenCV 對其進(jìn)行處理以檢測人數(shù)。如果它檢測到人,你會在它周圍找到一個(gè)像這樣的框:
現(xiàn)在檢查您的 ThingSpeak 頻道,您可以在其中監(jiān)控來自世界任何地方的人群規(guī)模。
導(dǎo)入簡歷2
導(dǎo)入 imutils
從 imutils.object_detection 導(dǎo)入 non_max_suppression
將 numpy 導(dǎo)入為 np
導(dǎo)入請求
進(jìn)口時(shí)間
導(dǎo)入base64
從 matplotlib 導(dǎo)入 pyplot 作為 plt
從 urllib.request 導(dǎo)入 urlopen
channel_id = 812060 # 在此處輸入頻道 ID
WRITE_API = 'X5AQ3EGIKMBYW31H' # 把你的寫密鑰放在這里
BASE_URL = "https://api.thingspeak.com/update?api_key={}".format(WRITE_API)
豬 = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# 在[3]:
def檢測器(圖像):
image = imutils.resize(image, width=min(400, image.shape[1]))
克隆 = image.copy()
rects, weights = hog.detectMultiScale(image, winStride=(4, 4), padding=(8, 8), scale=1.05)
對于矩形中的 (x, y, w, h):
cv2.rectangle(圖像, (x, y), (x + w, y + h), (0, 0, 255), 2)
rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])
結(jié)果 = non_max_suppression(rects,probs=None,overlapThresh=0.7)
返回結(jié)果
def 記錄(sample_time=5):
打印(“錄音”)
相機(jī) = cv2.VideoCapture(0)
初始化 = time.time()
# ubidots 樣本限制
如果 sample_time < 3:
采樣時(shí)間 = 1
而(真):
打?。ā懊笨颉保?br />
ret, frame = camera.read()
frame = imutils.resize(frame, width=min(400, frame.shape[1]))
結(jié)果=檢測器(frame.copy())
結(jié)果1 = len(結(jié)果)
打印(結(jié)果1)
對于 (xA, yA, xB, yB) 結(jié)果:
cv2.rectangle(frame, (xA, yA), (xB, yB), (0, 255, 0), 2)
plt.imshow(幀)
plt.show()
# 發(fā)送結(jié)果
如果 time.time() - init >= sample_time:
thingspeakHttp = BASE_URL + "&field1={}".format(result1)
打?。╰hingspeakHttp)
conn = urlopen(thingspeakHttp)
print("發(fā)送結(jié)果")
初始化 = time.time()
相機(jī).release()
cv2.destroyAllWindows()
# 在[7]:
定義主():
記錄()
# 在[8]:
如果 __name__ == '__main__':
主要的()
-
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2256瀏覽量
94614 -
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41368
發(fā)布評論請先 登錄
相關(guān)推薦
評論