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

構(gòu)建Raspberry Pi電機驅(qū)動器HAT的教程分享

如何使用OpenCV和Raspberry Pi構(gòu)建睡眠感應(yīng)和警報系統(tǒng)

構(gòu)建一個基于Raspberry Pi的藍牙揚聲器

使用Raspberry Pi上的OpenCV庫構(gòu)建人臉識別系統(tǒng)

如何在Raspberry Pi 3上安裝OpenCV4庫

使用Raspberry Pi構(gòu)建水位傳感器

構(gòu)建自己的Raspberry Pi ALPR停車系統(tǒng)

Raspberry Pi Zero便攜終端的構(gòu)建

Raspberry Pi構(gòu)建復(fù)古風(fēng)格終端

使用Raspberry Pi構(gòu)建網(wǎng)絡(luò)攝像頭

評論