在樹莓派中安裝OpenCV庫
安裝依賴
# 更新軟件源,更新軟件
sudo apt-get update && sudo apt-get upgrade
# Cmake等開發者工具
sudo apt-get install build-essential cmake pkg-config
# 圖片I/O包
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
# 視頻I/O包
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
# OpenCV用於顯示圖片的子模塊需要GTK
sudo apt-get install libgtk2.0-dev libgtk-3-dev
# 性能優化包
sudo apt-get install libatlas-base-dev gfortran
# 安裝 Python2.7 & Python3
sudo apt-get install python2.7-dev python3-dev
下載OpenCV源代碼
推薦使用新版。我們嘗試過3.3.0和4.3.0兩個版本,3.3.0在編譯過程中遇到了4次錯誤(所幸重新編譯會保留之前的進度,不用從頭開始),修改相應文件可解決。后續為Docker容器編譯4.3.0版本時,發現編譯過程中沒有出現錯誤。
-
官方 opencv 與 opencv/opencv_contrib (版本號需要一致,下載速度慢)
-
或 3.3.0 網盤下載 (感謝群里同學分享)
下載完成后,分別解壓到同一目錄下。
准備編譯環境
# 安裝pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo python3 get-pip.py
# 安裝虛擬環境,防止依賴沖突
sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip
# > 重定向輸出流 >> 表示追加
echo -e "\n# virtualenv and virtualenvwrapper" >> ~/.profile
echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.profile
echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.profile
echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.profile
# 每次新開終端,需要虛擬環境時都要運行
source ~/.profile
# 創建虛擬環境cv
mkvirtualenv cv -p python3
# 進入虛擬環境
workon cv
# 安裝numpy,較耗時
pip install numpy
編譯OpenCV
要確保已經進入了cv虛擬環境,命令提示符開頭有(cv)。
# 這里我們用的是3.3.0版本
cd ~/opencv-3.3.0/
mkdir build
cd build
# 設置CMake構建選項
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules \
-D BUILD_EXAMPLES=ON ..
為了避免編譯時內存不足導致的CPU掛起,調整swap交換文件大小:
# CONF_SWAPSIZE由100改為1024,編譯完成后改回來
sudo nano /etc/dphys-swapfile
# 重啟swap服務
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
到這里就完成了大部分准備工作,開始編譯:
# 開始編譯,很耗時
make -j4
如果使用的是3.3.0版本,可能會出現一些編譯錯誤,參見OpenCV 3.3.0編譯錯誤及解決
編譯完成后的輸出:
安裝OpenCV
sudo make install
sudo ldconfig
# 更名
cd /usr/local/lib/python3.7/site-packages/
sudo mv cv2.cpython-37m-arm-linux-gnueabihf.so cv2.so
測試OpenCV
source ~/.profile
workon cv
python
import cv2
cv2.__version__
使用OpenCV和Python控制樹莓派的攝像頭
source ~/.profile
workon cv
pip install "picamera[array]"
拍照測試
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
camera = PiCamera()
rawCapture = PiRGBArray(camera)
time.sleep(5) # 感光時間需要長一些
camera.capture(rawCapture, format="bgr")
image = rawCapture.array
cv2.imshow("Image", image)
cv2.waitKey(0)
視頻流測試
使用PiRGBArray可以避免壓縮成JPEG格式的大量開銷。
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
time.sleep(0.1)
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
image = frame.array
cv2.imshow("Frame", image)
key = cv2.waitKey(1) & 0xFF
rawCapture.truncate(0)
if key == ord("q"):
break
利用樹莓派的攝像頭實現人臉識別
准備好需要用到的代碼文件和圖片,都可以在face_recognition的Github倉庫中找到
安裝依賴庫
pip install dlib face_recognition numpy
facerec_on_raspberry_pi.py
得拿張圖對着攝像頭,雖然沒有畫面。
facerec_from_webcam_faster.py
結合微服務的進階任務
原本自己寫了個Dockerfile在容器中構建OpenCV 4.3.0,編譯N久后終於完成,但是始終無法連接到PiCamera(提示缺少libbcm_host.so,排查失敗),不想再經歷一次那么長的編譯時間遂放棄。最后在DockerHub上淘了個基於樹莓派鏡像,並且已經安裝好OpenCV的鏡像,稍作修改就跑了起來。
為了讓Docker由訪問圖形化界面的能力,在宿主機上允許訪問顯示接口:
# 允許所有用戶訪問顯示接口
xhost +
# 只允許Docker用戶訪問顯示接口 (兩者選其一即可)
xhost +local:docker
Dockerfile
FROM demosense/raspberrypi3-opencv
RUN pip install picamera dlib face_recognition numpy \
&& apt install x11-xserver-utils # 利用xserver提供圖形化界面
docker build -t my-cv .
docker run -it --rm \ # 交互式界面、用完即刪
--device /dev/vchiq \ # 提供攝像頭,也可以用–-privileged提供所有設備
-e DISPLAY=unix$DISPLAY \ # 提供顯示輸出
-v /tmp/.X11-unix:/tmp/.X11-unix \ # 宿主機xserver的socket
-v /home/pi/Desktop/codes:/codes \ # 掛載所需的文件
my-cv \
bash
facerec_on_raspberry_pi.py
還是熟悉的味道。
(選做)facerec_from_webcam_faster.py
在容器中運行似乎比較慢,大概要等半分鍾才會出預覽畫面,也比較卡頓。
換了好幾個姿勢才讓兩個人同時被識別到 Orz
遇到的問題及解決
OpenCV3.3.0編譯錯誤及解決
限於篇幅新開了一篇博文
Unable to stop the stream: Device or resource busy
這是因為攝像頭被上一個程序使用並且沒有釋放。用完攝像頭要及時cameara.close()/video_capture.release(),或者用ps -u
查看正在運行的python,然后kill -9 PID
結束進程來解除占用。
協作
第24組
學號 | 姓名 | 貢獻 |
---|---|---|
031702422 | 朱宏 | 查閱資料 部分博客 |
031702419 | 姚彬錕 | 查閱資料 錯誤總結 |
031702420 | 張慶焰 | 實際操作 博客撰寫 |
我們通過騰訊會議共享屏幕和語音的方式,進行了長達12個小時的協(liao)作(tian),也許這就是996吧🌚。
參考
第7次實踐作業 - 作業 - 2017級系統綜合實踐 - 班級博客 - 博客園
Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi - PyImageSearch
Accessing the Raspberry Pi Camera with OpenCV and Python - PyImageSearch
樹莓派實現簡單的人臉識別_人工智能_yonglisikao的博客-CSDN博客
Docker 掛載攝像頭並顯示圖像_運維_I'm George 的博客-CSDN博客
我是如何用樹莓派 + Docker 輕松實現人臉識別應用的? - 雲+社區 - 騰訊雲
demosense/raspberrypi3-opencv - Docker Hub
janza/docker-python3-opencv: 🐋 🐍 👁 Docker image with python 3 and opencv 4.1
What is /tmp/.X11-unix/? - Unix & Linux Stack Exchange