大家好,這是一個樹莓派和OpenCV的連載專題。
使用樹莓派與OpenCV實現(xiàn)姿態(tài)估計和面部特征點追蹤
使用樹莓派與OpenCV實現(xiàn)面部和運動追蹤的云臺系統(tǒng)
使用樹莓派和OpenCV實現(xiàn)手部識別與手指識別
使用樹莓派和OpenCV實時掃描并存儲二維碼
使用樹莓派和OpenCV實現(xiàn)物體與動物識別
使用樹莓派、攝像頭和OpenCV進行速度檢測
用樹莓派 + OpenCV 打造人臉識別技術(shù)!
今天是第二部分:使用樹莓派與OpenCV實現(xiàn)面部和運動追蹤的云臺系統(tǒng)
如果大家對這個專題感興趣,記得關(guān)注樹莓派開發(fā)者,這樣你將會第一時間收到我們的內(nèi)容更新通知。
本文將介紹如何使用樹莓派單板計算機控制一個云臺系統(tǒng),使其將你的面部保持在畫面中心。本文不僅旨在創(chuàng)建一個易于使用的帶云臺帽的面部追蹤系統(tǒng),還希望以一種便于擴展的方式來實現(xiàn),無論你選擇使用何種系統(tǒng)或添加何種代碼。此外,我還將演示如何控制旋轉(zhuǎn)速度,使其非常平滑或非常快。
完成上述步驟后,下一步是為云臺系統(tǒng)編寫一個巡邏階段代碼。因此,當(dāng)它沒有看到任何面部時,它會在其自由度范圍內(nèi)進行邏輯移動以搜索面部。然后,為了進一步輔助這個巡邏階段,我們可以在代碼中添加自動轉(zhuǎn)向任何識別到的移動物體的功能。
本頁面廣泛使用了Pimironi Picade云臺帽,它可以讓你將云臺模塊安裝在樹莓派掌上電腦的頂部。
你需要準(zhǔn)備什么
Open-CV和其他必需的軟件包
功能性面部追蹤代碼
從巡邏到運動追蹤再到面部追蹤
接下來做什么
在樹莓派“Buster”操作系統(tǒng)上安裝Open-CV
下載內(nèi)容
本設(shè)置將使用Open-CV來識別面部和運動。這是一個強大的資源庫,有助于解決實時計算機視覺和圖像處理問題。下圖是攝像頭正確追蹤我的面部的畫面。

現(xiàn)在,我們始終將動作保持在畫面中!運行此系統(tǒng)的代碼可以從本頁底部的鏈接下載。一如既往,如果你有任何問題、疑問或希望看到新增的內(nèi)容,請告訴我們你的想法!
你需要準(zhǔn)備什么
以下是讓本系統(tǒng)快速運行所需的組件列表。硬件構(gòu)建過程可以在我之前發(fā)布的Pimoroni Picade云臺帽指南中找到,該指南將為你提供組裝此帽和樹莓派所需的所有知識。
https://core-electronics.com.au/guides/raspberry-pi/pan-tilt-hat-raspberry-pi/
樹莓派4B(這款樹莓派提供的額外計算能力對這項任務(wù)非常有幫助)
樹莓派官方攝像頭模塊V2(但也可以與任何具有類似外形尺寸的攝像頭一起使用,廣角攝像頭模塊在這里效果很好)
Pimoroni云臺帽
Micro SD卡(已安裝樹莓派操作系統(tǒng),連接到互聯(lián)網(wǎng),并在配置設(shè)置中啟用了攝像頭)
顯示器
HDMI線
鼠標(biāo)和鍵盤
Open-CV和其他必需的軟件包
要使本系統(tǒng)正常運行,你需要幾個軟件包。重要的是,為了實現(xiàn)這一功能,我們將利用Open-CV軟件包的強大功能,為我們的面部追蹤系統(tǒng)創(chuàng)建更簡單的代碼。要安裝它,我們將在終端中輸入在“在樹莓派操作系統(tǒng)上安裝Open-CV”部分中找到的命令行。
https://core-electronics.com.au/guides/raspberry-pi/face-tracking-raspberry-pi/#Setting
使用屏幕左上角的黑色按鈕打開一個新終端。下面你可以看到在樹莓派“Buster”桌面上打開終端的樣子,圖中有一個大箭頭指向用鼠標(biāo)點擊打開終端的圖標(biāo)。
如果提示,請輸入 | Y | 并按回車鍵繼續(xù)安裝過程。安裝每個軟件包可能需要一些時間。進一步往下看,你可以看到正在下載第二行的圖像。這里的每一行大多用于將當(dāng)前軟件包更新和安裝到當(dāng)前設(shè)置中,并以 | sudo | 命令開頭。以 | sudo | 開頭的每一行都將以管理員權(quán)限運行。

你還需要像之前一樣在終端中輸入以下兩行命令。這將使我們的Pimoroni Picade云臺帽能夠與樹莓派高效配合工作。有關(guān)此軟件包的更多信息,請點擊此處。
https://core-electronics.com.au/guides/raspberry-pi/pan-tilt-hat-raspberry-pi/
完成這些步驟后,你就可以使用本應(yīng)用程序所需的所有軟件包了。快速重啟系統(tǒng)以鎖定所有這些更改。
sudo apt-getupdate && sudo apt-getupgradecurl https://get.pimoroni.com/pantilthat | bashsudo apt-getinstall python-opencv python3-opencv opencv-data
功能性面部追蹤代碼
以下是我們將用于運行Pimoroni Picade帽面部追蹤系統(tǒng)的代碼。它將識別面部,并嘗試通過伺服電機進行平移和傾斜,使面部保持在捕捉視頻的中心。代碼有完整的注釋,因此你可以理解每個部分的作用和目的。
#!/usr/bin/env python#Below we are importing functionality to our Code, OPEN-CV, Time, and Pimoroni Pan Tilt Hat Package of particular note.importcv2, sys, time, osfrompantilthatimport*# Load the BCM V4l2 driver for /dev/video0. This driver has been installed from earlier terminal commands. #This is really just to ensure everything is as it should be.os.system('sudo modprobe bcm2835-v4l2')# Set the framerate (not sure this does anything! But you can change the number after | -p | to allegedly increase or decrease the framerate).os.system('v4l2-ctl -p 40')# Frame Size. Smaller is faster, but less accurate.# Wide and short is better, since moving your head up and down is harder to do.# W = 160 and H = 100 are good settings if you are using and earlier Raspberry Pi Version.FRAME_W =320FRAME_H =200# Default Pan/Tilt for the camera in degrees. I have set it up to roughly point at my face location when it starts the code.# Camera range is from 0 to 180. Alter the values below to determine the starting point for your pan and tilt.cam_pan =40cam_tilt =20# Set up the Cascade Classifier for face tracking. This is using the Haar Cascade face recognition method with LBP = Local Binary Patterns. # Seen below is commented out the slower method to get face tracking done using only the HAAR method.# cascPath = 'haarcascade_frontalface_default.xml' # sys.argv[1]cascPath ='/usr/share/opencv/lbpcascades/lbpcascade_frontalface.xml'faceCascade = cv2.CascadeClassifier(cascPath)# Start and set up the video capture with our selected frame size. Make sure these values match the same width and height values that you choose at the start.cap = cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320);cap.set(cv2.CAP_PROP_FRAME_HEIGHT,200);time.sleep(2)# Turn the camera to the Start position (the data that pan() and tilt() functions expect to see are any numbers between -90 to 90 degrees).pan(cam_pan-90)tilt(cam_tilt-90)light_mode(WS2812)# Light control down here. If you have a LED stick wired up to the Pimoroni HAT it will light up when it has located a face.deflights(r,g,b,w): forxinrange(18): set_pixel_rgbw(x,rifxin[3,4]else0,gifxin[3,4]else0,b,wifxin[0,1,6,7]else0) show()lights(0,0,0,50)#Below we are creating an infinite loop, the system will run forever or until we manually tell it to stop (or use the "q" button on our keyboard)whileTrue: # Capture frame-by-frame ret, frame = cap.read() # This line lets you mount the camera the "right" way up, with neopixels above frame = cv2.flip(frame, -1)
ifret ==False: print("Error getting image") continue # Convert to greyscale for easier faster accurate face detection gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray = cv2.equalizeHist( gray ) # Do face detection to search for faces from these captures frames faces = faceCascade.detectMultiScale(frame,1.1,3,0, (10,10))
# Slower method (this gets used only if the slower HAAR method was uncommented above. '''faces = faceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=4, minSize=(20, 20), flags=cv2.cv.CV_HAAR_SCALE_IMAGE | cv2.cv.CV_HAAR_FIND_BIGGEST_OBJECT | cv2.cv.CV_HAAR_DO_ROUGH_SEARCH )'''
lights(50iflen(faces) ==0else0,50iflen(faces) >0else0,0,50) #Below draws the rectangle onto the screen then determines how to move the camera module so that the face can always be in the centre of screen. for(x, y, w, h)infaces: # Draw a green rectangle around the face (There is a lot of control to be had here, for example If you want a bigger border change 4 to 8) cv2.rectangle(frame, (x, y), (x w, y h), (0,255,0),4) # Track face with the square around it
# Get the centre of the face x = x (w/2) y = y (h/2) # Correct relative to centre of image turn_x =float(x - (FRAME_W/2)) turn_y =float(y - (FRAME_H/2)) # Convert to percentage offset turn_x /=float(FRAME_W/2) turn_y /=float(FRAME_H/2) # Scale offset to degrees (that 2.5 value below acts like the Proportional factor in PID) turn_x *=2.5# VFOV turn_y *=2.5# HFOV cam_pan = -turn_x cam_tilt = turn_y print(cam_pan-90, cam_tilt-90) # Clamp Pan/Tilt to 0 to 180 degrees cam_pan =max(0,min(180,cam_pan)) cam_tilt =max(0,min(180,cam_tilt)) # Update the servos pan(int(cam_pan-90)) tilt(int(cam_tilt-90)) break #Orientate the frame so you can see it. frame = cv2.resize(frame, (540,300)) frame = cv2.flip(frame,1)
# Display the video captured, with rectangles overlayed # onto the Pi desktop cv2.imshow('Video', frame) #If you type q at any point this will end the loop and thus end the code. ifcv2.waitKey(1) &0xFF==ord('q'): break# When everything is done, release the capture information and stop everythingvideo_capture.release()cv2.destroyAllWindows()
現(xiàn)在,讓我們在Thonny IDE中打開上面的代碼。你可以通過將上面的代碼復(fù)制、粘貼并保存到Thonny IDE中,然后右鍵單擊 | facetracker.py | Python代碼并在Thonny IDE中打開它。然后,只要你運行它(通過按下那個大的綠色運行按鈕),它就會啟動面部追蹤。它會保持靜止,直到找到面部,然后它會嘗試將該面部保持在畫面中心,即使你試圖讓它離開畫面。請參見下圖。

對于那些看過《樹莓派面部識別》指南的人來說,你會注意到這里用于識別面部的系統(tǒng)與該指南中使用的系統(tǒng)不同。這里的面部檢測使用的是一種稱為Haar級聯(lián)的系統(tǒng)。Haar級聯(lián)檢測是最古老但功能強大的人臉檢測算法之一。該算法由Viola和Jones于2001年首次發(fā)表,遠在深度學(xué)習(xí)獲得廣泛關(guān)注之前。這個系統(tǒng)無法識別不同的面部,但作為交換,它在尋找人臉方面要快得多。這里使用的是Haar級聯(lián)的一種變體,稱為LBP(局部二值模式),它比原始的Haar級聯(lián)方法更快,但略不準(zhǔn)確。由于這個速度原因,它被有效地應(yīng)用在我們的單板面部追蹤系統(tǒng)中。下面顯示的是你運行上述代碼時在桌面上看到的內(nèi)容。

值得編輯代碼的地方。在代碼中,你會找到一個名為“將偏移量縮放為角度”的部分(你也可以在上面的圖像中看到這個部分)。默認(rèn)的縮放偏移量值為2.5,但在這里你可以降低該值以使伺服操作更平滑,或者增加該值以使攝像頭調(diào)整得更遠。在這里進行微小的更改可以產(chǎn)生很大的不同。在同一部分中,你還可以更改 | turn_x | 和 | turn_y | 值的正負(fù)號。這將使攝像頭變得非常害羞,永遠不會盯著人看。這段代碼還有很多LED燈條控制功能,你可以輕松利用并根據(jù)自己的喜好進行編輯。
巡邏和運動感應(yīng)
另一個值得添加到系統(tǒng)中的功能是當(dāng)它沒有看到任何面部時的巡邏設(shè)置。更進一步的是,如果你看到任何運動,就將攝像頭轉(zhuǎn)向該運動方向。然后,如果你看到面部,就鎖定該面部并忽略前兩個階段。好吧,在下面的下載內(nèi)容中,正是提供了實現(xiàn)這一功能的代碼。
https://core-electronics.com.au/media/kbase/507/Face-Tracking-Pimoroni-Codes.zip
非常感謝Claude Pageau,因為我基于他之前的工作(特別是面部追蹤演示)編寫了下面的很多代碼。有很多設(shè)置你可以調(diào)整,值得查看 | config.py | 文件以了解你可以更改的內(nèi)容。因此,以下面的方式下載并運行 | Face-Track-Pan-Tilt-HAT-Pimoroni.py | 代碼。請參見下圖,了解伺服電機在哨兵模式下將執(zhí)行的默認(rèn)位置。在每個位置,它會暫停一秒鐘,然后再進入下一個位置。這完全可定制,并且每當(dāng)它無法看到人或運動時都會發(fā)生。

然后,當(dāng)識別到運動時,它會使用平移和傾斜功能將攝像頭畫面的中心對準(zhǔn)運動方向。你可以看到,當(dāng)我側(cè)身走過(不向攝像頭展示我的面部)時,它始終將我保持在畫面中。每當(dāng)它看到運動時,它會在視頻畫面上放置一個綠色圓圈,以指示它估計的運動中心位置。

然后,當(dāng)它找到面部時,它會迅速對準(zhǔn)面部,在視頻流上圍繞面部繪制一個藍色方框,并盡一切可能緊緊鎖定該面部,使你的面部始終保持在畫面中心。請參見下圖。一旦它找不到面部,它就會返回哨兵模式。這段代碼的運行方式非常類似于《傳送門》中的哨兵炮塔(沒有危險和聲音)。
https://theportalwiki.com/wiki/Turrets

接下來做什么
這有很多優(yōu)秀的拓展方向。例如,當(dāng)你看到多個面部時該怎么辦?根據(jù)特定參數(shù)將偏好設(shè)置給一個面部而不是另一個面部將是一個值得添加的代碼功能。想象這樣一個場景:你感興趣的人戴著口罩。在這種情況下,也許我們可以不運行面部檢測,而是運行一個對象檢測層,僅搜索人員。
有很多種云臺方法,我試圖使這些方法能夠成功集成到代碼中。許多云臺系統(tǒng)使用緩慢移動的無刷直流電機,有些使用步進電機。稍微修改一下代碼,你就可以成功地運行任何云臺系統(tǒng)。
另一個值得一提的點是PID(比例積分微分)控制。我們的系統(tǒng)正在全速運行,因此一旦它識別到面部,它就會在面部周圍繪制一個方框,并立即確定移動角度。目前代碼中沒有編程的PID控制器層(但我認(rèn)為從硬件、軟件及其限制的組合中自然會產(chǎn)生一個PID)。這里已經(jīng)有一些PID控制了,例如,如果你在第一個代碼中增加縮放偏移量值,你就是在增加P值。然而,通過在代碼中加入特定的PID層,完全有可能使云臺帽以平滑的弧線和掃動方式運行。然而,添加這種額外的復(fù)雜性會使系統(tǒng)運行速度變慢,但我已經(jīng)看到有人在樹莓派上實現(xiàn)了這一點。
https://www.pyimagesearch.com/2019/04/01/pan-tilt-face-tracking-with-a-raspberry-pi-and-opencv/
在樹莓派“Buster”操作系統(tǒng)上安裝Open-CV
以下是在樹莓派上安裝Open-CV以使其適用于對象識別的計算機視覺的詳細流程。很快,我將創(chuàng)建一個腳本/單獨的教程來簡化此流程。打開一臺運行著全新樹莓派“Buster”操作系統(tǒng)并連接到互聯(lián)網(wǎng)的樹莓派4B。
使用屏幕左上角的按鈕打開終端。將每個命令復(fù)制并粘貼到樹莓派的終端中,按Enter鍵,并等待其完成后再執(zhí)行下一個命令。如果提示“你想繼續(xù)嗎?(y/n)”,請按Y鍵,然后按Enter鍵繼續(xù)。
sudo apt-getupdate&&sudo apt-getupgrade
在運行下一組命令之前,我們必須先擴展交換文件。為此,在終端中輸入以下行。
sudo nano /etc/dphys-swapfile
將 CONF_SWAPSIZE = 100 更改為 CONF_SWAPSIZE=2048。完成此操作后,按Ctrl-X、Y,然后按Enter鍵保存這些更改。此更改只是暫時的,完成此操作后你應(yīng)該將其改回。為了使這些更改生效,我們必須通過向終端輸入以下命令來重啟交換文件。然后,我們將像往常一樣繼續(xù)輸入終端命令。
sudo apt-get install build-essential cmake pkg-configsudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-devsudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-devsudo apt-get install libxvidcore-dev libx264-devsudo apt-get install libgtk2.0-dev libgtk-3-devsudo apt-get install libatlas-base-dev gfortransudo pip3 install numpywget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zipwget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zipunzip opencv.zipunzip opencv_contrib.zipcd~/opencv-4.4.0/mkdirbuildcdbuildcmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.4.0/modules \ -D BUILD_EXAMPLES=ON ..make -j $(nproc)
此 | make | 命令將需要超過一個小時來安裝,并且不會有任何關(guān)于還需多長時間的指示。它也可能會凍結(jié)顯示器。請耐心等待,它會正常工作的。一旦完成,你就完成了大部分工作。如果它在任何時候失敗,你會收到類似 | make: *** [Makefile all] Error 2 | 的消息,只需重新輸入并執(zhí)行上面的 | make -j $(nproc) | 行。不要害怕,它會記住已經(jīng)完成的所有工作,并從停止的地方繼續(xù)。一旦完成,我們將繼續(xù)輸入終端命令。
sudomake install && sudo ldconfigsudo reboot
下載內(nèi)容
以下是運行上述示例所需的所有代碼。這些代碼都有完整的注釋,因此你可以輕松理解并修改它們,以滿足你的需求。
https://core-electronics.com.au/media/kbase/507/Face-Tracking-Pimoroni-Codes.zip
-
OpenCV
+關(guān)注
關(guān)注
33文章
651瀏覽量
44486 -
樹莓派
+關(guān)注
關(guān)注
122文章
2072瀏覽量
109971 -
云臺系統(tǒng)
+關(guān)注
關(guān)注
0文章
2瀏覽量
1170
發(fā)布評論請先 登錄
樹莓派上使用OpenCV和Python實現(xiàn)實時人臉檢測
樹莓派打造視頻監(jiān)控機器人Verybot
樹莓派之球形追蹤
樹莓派入門套裝
【創(chuàng)龍AM4379 Cortex-A9申請】無人機無線追蹤系統(tǒng)
樹莓派跑opencv的程序效果不是很好
樹莓派與Arduino實現(xiàn)藥板自助取藥
樹莓派的智能語音控制系統(tǒng)
怎么實現(xiàn)樹莓派Pico電機運動控制MicroPython+pioasm編程?
樹莓派3硬件配置_樹莓派3都能裝什么系統(tǒng)_樹莓派3系統(tǒng)安裝教程
微雪電子樹莓派云臺擴展板|Pan-Tilt HAT介紹

如何使用樹莓派與OpenCV實現(xiàn)面部和運動追蹤的云臺系統(tǒng)?
評論