2020系統綜合實踐 第七次實踐作業 28組

發表於2020-06-06

1️⃣ 在樹莓派中安裝opencv庫

(1)安裝依賴

如果執行某條指令時出現依賴包問題,建議使用sudo aptitude install(需要先sudo apt-get install aptitude安裝aptitude)

#更新和升級任何現有軟體包
$ sudo apt-get update && sudo apt-get upgrade
#安裝一些開發人員工具,包括CMake,它可以幫助配置OpenCV構建過程:
$ sudo apt-get install build-essential cmake pkg-config
#安裝一些映像I/O包,以允許從磁碟載入各種映像檔案格式。此類檔案格式的示例包括JPEG,PNG,TIFF等
$ 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
#GTK用於在螢幕上顯示影像並構建基本的GUI
$ sudo apt-get install libgtk2.0-dev libgtk-3-dev
#效能優化包
$ sudo apt-get install libatlas-base-dev gfortran
#安裝Python 2.7和Python 3
$ sudo apt-get install python2.7-dev python3-dev

(2)下載OpenCV原始碼

cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.3.0.zip
$ unzip opencv.zip
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.3.0.zip
$ unzip opencv_contrib.zip

(3)安裝pip

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo python3 get-pip.py



(4)安裝Python虛擬機器

pip安裝時,使用國內源加速-i https://mirrors.aliyun.com/pypi/simple

# 安裝虛擬環境,防止依賴衝突
sudo pip install virtualenv virtualenvwrapper -i https://mirrors.aliyun.com/pypi/simple
sudo rm -rf ~/.cache/pip



配置~/.profile時,需要新增新的環境變數,否則會出現如下錯誤

export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv # 這條不可缺少
source /usr/local/bin/virtualenvwrapper.sh
export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin # 這條可忽略

載入配置檔案,使之生效

# 每次新開終端,要進入python虛擬機器都需要事先載入配置檔案
source ~/.profile

使用Python3 安裝虛擬機器

mkvirtualenv cv -p python3

進入虛擬機器

source ~/.profile
$ workon cv

安裝numpy

由於pip預設從官網上下載第三方庫,限於網速問題,多次pip install numpy失敗(換源無效),無奈之下只好先在本機上手動下載numpy的.whl檔案,通過ssh傳輸到樹莓派中,再進行離線安裝

#https://www.piwheels.org/simple/numpy/numpy-1.18.4-cp37-cp37m-linux_armv7l.whl (10.4 MB)
#在Window系統下命令列中輸入如下
scp <localfile> pi@192.168.1.9:/home/pi/
$ 輸入密碼 <password>

將接收到的.whl檔案存放到python的site-packages下,然後使用如下指令進行安裝

python -m pip install <檔名>

成功安裝Numpy

(5)編譯OpenCV

# 設定CMake構建選項
cd ~/opencv-3.3.0/
$ mkdir build
$ cd build
$ 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 ..

檢查numpy的安裝

增大了交換空間CONF_SWAPSIZE=1024

# 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 

安裝OpenCV

$ sudo make install
$ sudo ldconfig
$ ls -l /usr/local/lib/python3.7/site-packages/
$ cd ~/.virtualenvs/cv/lib/python3.7/site-packages/
#建立軟鏈
$ ln -s /usr/local/lib/python3.7/site-packages/cv2.cpython-37m-arm-linux-gnueabihf.so cv2

(6)驗證安裝

$ source ~/.profile 
$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
'3.3.0'
>>>

2️⃣使用opencv和python控制樹莓派的攝像頭

(1)picamare模組安裝

開啟虛擬機器

$ source ~/.profile #每次開啟虛擬機器之前都需要source配置檔案,否則無法開啟
$ workon cv

安裝picamare

$ pip install "picamera[array]"

(2)在Python程式碼中匯入OpenCV控制攝像頭

拍照功能程式碼test_image.py:

# import the necessary packages
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
 
# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
rawCapture = PiRGBArray(camera)
 
# allow the camera to warmup
time.sleep(3) #此處把0.1改成了3
 
# grab an image from the camera
camera.capture(rawCapture, format="bgr")
image = rawCapture.array
 
# display the image on screen and wait for a keypress
cv2.imshow("Image", image)
cv2.waitKey(0)

拍照:

攝像功能程式碼video_test.py:

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

攝像:

3️⃣Raspberry Pi 的人臉識別

注:所有操作均在python虛擬機器中進行

安裝dlib以及實現人臉識別功能的開源模組face_recogniztion

$ pip install dlib
$ pip install face_recognition

執行GitHub上face_recognition倉庫下的程式碼

執行時需要將攝像頭對準影像或照片,儘量離得近一點,識別成功率更高

同一個程式碼倉庫下的另一個示例

該示例引入opencv來處理影像資訊,可以實時顯示當前攝像頭識別到的人臉資訊

4️⃣ 結合微服務的進階任務

docker安裝(參考樹莓派上 Docker 的安裝和使用

sudo apt install docker-ce

拉取已配置python環境和opencv的映象(支援arm)sixsq/opencv-python

#配置docker的映象加速
sudo nano /etc/docker/daemon.json
#重新載入docker服務的配置檔案
systemctl dameon-reload
#重啟docker 服務
systemctl restart docker
#拉取映象
sudo docker pull sixsq/opencv-python


進入容器並安裝庫

sudo docker run -it sixsq/opencv-python /bin/bash
pip install "picamera[array]" dlib face_recognition

安裝成功後進行commit

sudo docker commit 79e08fabc3fd face_opencv
sudo docker images

建立raspberrypi資料夾及相關檔案

  • Dockerfile
FROM face_opencv
RUN mkdir /myapp
WORKDIR /myapp
COPY myapp .

build映象

sudo docker build -t myface_opencv

在容器中跑通示例程式碼facerec_on_raspberry_pi.py

一定要確保攝像頭開啟,檢查是否存在video0檔案

sudo docker run -it --device=/dev/vchiq --device=/dev/video0 --name myface_opencv myface_opencv
python3 facerec_on_raspberry_pi.py

(選做)在容器中跑通示例程式碼facerec_from_webcam_faster.py

#sudo apt-get install x11-xserver-utils
xhost +
sudo docker run -it --rm \
	-v /tmp/.X11-unix:/tmp/.X11-unix \
	-e DISPLAY=:0.0 \
	-e QT_X11_NO_MITSHM=1 \
  	--device=/dev/vchiq \
	--device=/dev/video0 \
	--name myface4 \
	myface_opencv \
	python3 facerec_from_webcam_faster.py



5️⃣問題與總結

  • 問題1-安裝依賴

    • 問題描述:出現需要安裝依賴和依賴衝突

    • 解決方法:使用sudo aptitude install

  • 問題2-安裝pip

    • 問題描述:安裝python3 get-pip.py時報錯誤AttributeError: module 're' has no attribute 'compile'

    • 問題解析:上次實驗殘留re.py檔案,和系統庫同名

    • 解決方法:刪除re.py檔案

  • 問題3-安裝Pyhton虛擬機器

    • 問題描述:使用Python3 安裝虛擬機器報錯

    • 解決方法:修改配置檔案如部落格上文所示

  • 問題4-編譯OpenCV

    • 問題描述:編譯時出現四次缺少hpp類的錯誤

    • 問題解析:出錯是由於hpp檔案不存在,但其檔案存在於opencv-contrib目錄下,可以在程式碼中將其路徑修改為檔案所在目錄對應的絕對路徑。

    • 解決方法:根據錯誤資訊提示的檔案目錄,找到配置檔案,將配置資訊修改

    • 前兩個報錯

    • #include "opencv2/xfeatures2d/cuda.hpp"

    • 改為

    • #include "/home/pi/opencv_contrib-3.3.0/modules/xfeatures2d/include/opencv2/xfeatures2d/cuda.hpp"

    • 第三個報錯

    • opencv2/xfeatures2d.hpp

    • 改為

    • /home/pi/opencv_contrib-3.3.0/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp

    • 第四個報錯

    • /opencv2/xfeatures2d/nonfree.hpp

    • 改為

    • include "/home/pi/opencv_contrib-3.3.0/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp"

  • 問題5

    • 問題描述:無效型別轉換

    • 解決方法:開啟程式碼檔案/home/pi/opencv-3.3.0/modules/python/src2/cv2.cpp在對應行進行強制型別轉換

  • 問題6

    • 問題描述:執行拍照功能程式碼時出錯,缺少gtk庫

    • 解決方法:

      • 首先下載缺少的庫libgtk2.0-dev和pkg-config,使用aptitude install下載該庫及相關依賴,然後使用cmake重新編譯OpenCv

      • 在cmake時要新增如下內容:-D WITH_QT=ON -D WITH_GTK=ON -D WITH_GTK_2_X=ON(參考連結OpenCV Error: The function is not implemented.解決方法

      • 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 \
            -D WITH_QT=ON \
            -D WITH_GTK=ON \
            -D WITH_GTK_2_X=ON ..
        
      • 如果cmake過程中出現如下錯誤,說明系統缺少Qt 4.x模組,需要使用pip安裝Qt 4:sudo apt-get install qt4-default

      • 使用命令sudo apt search qt4-default,出現以下內容說明安裝成功

      • 使用make -j4重新編譯安裝opencv(又是一段漫長的等待,建議睡個覺再繼續嗷)

6️⃣小組協作記錄

小組成員及分工

學號 姓名 分工
031702311 陳珊珊 負責實際操作,問題解決,部落格撰寫
031702321 林鑫燦 負責查閱資料,問題解決,部落格撰寫
031702336 林家偉 負責查閱資料,問題解決,部落格撰寫

線上協作記錄

我們小組通過螢幕分享的方式直播操作,遇到問題大家一起解決,大概經過16個小時的奮鬥我們終於完成了!!!

相關文章