系統綜合實踐第7次做業

在樹莓派中安裝opencv庫

參考教程:關於opencv的編譯安裝,能夠參考Adrian Rosebrock的Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pihtml

步驟1:

1.擴展文件系統後從新啓動Pi

reboot.jpg

2.驗證磁盤是否已擴展並檢查輸出

vetify.jpg

步驟2:

1.更新和升級任何現有軟件包

$ sudo apt-get update && sudo apt-get upgrade

updata&upgrade.jpg

2.安裝開發人員工具來能夠幫助咱們配置OpenCV構建過程

$ sudo apt-get install build-essential cmake pkg-config

cmake.jpg

3.安裝 image I/O packages 以容許咱們從磁盤加載各類映像文件格式

$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

image-io.jpg

4.安裝 video I/O packages 使咱們可以從磁盤讀取各類視頻文件格式,以及直接使用視頻流

$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev

vedeo-io-1.jpg

vedeo-io-2.jpg

5.爲了編譯 highgui 模塊,咱們須要安裝GTK開發庫

$ sudo apt-get install libgtk2.0-dev libgtk-3-dev

highgui.jpg

6.經過安裝一些額外的依賴項,能夠進一步優化OpenCV內部的許多操做(即matrix矩陣操做)

$ sudo apt-get install libatlas-base-dev gfortran

matrix.jpg

7.安裝 Python 2.7 和 Python 3,以便咱們可使用Python綁定編譯OpenCV:

$ sudo apt-get install python2.7-dev python3-dev

python-already.jpg

ps:雖然這步明顯系統會顯示已經安裝(raspbian系統自帶),但教程提示別輕易跳過

python-warn

步驟3:

1.下載OpenCV源代碼

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

opencv-code.jpg

2.把 opencv 移動到桌面(包括後面的opencv_contrive.zip,get-pip.zip,均可用到vnc的傳輸文件功能)

transfile-opencv.jpg

步驟4:

1.首先須要安裝 pip ,一個Python包管理器

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

超時了。。。python

get-pip-timeout.jpg

而後從新弄就成功了。。。linux

get-pip-success.jpg

2.安裝Python虛擬環境

$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/.cache/pip

virtual.jpg

3.更新咱們的 〜/ .profile文件(該處與問教程有些許出路,按原教程會出錯)

$ 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

profilr.jpg

4.建立Python虛擬環境並進入虛擬環境(如下開始都要在cv下進行,即python虛擬環境)

$ mkvirtualenv cv -p python2
$ source ~/.profile
$ workon cv

cv.jpg

5.安裝NumPy

又又又超時了。。。git

numpy-timeout.jpg

換了個時間就成功了github

numpy-success.png

步驟5:

1使用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 ..

2.查看 cmake輸出的python3部分

build-py3.png

3打開/etc/dphys-swapfile 文件而後編輯 CONF_SWAPSIZE 變量

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
# CONF_SWAPSIZE=100
CONF_SWAPSIZE=1024

4.從新啓動交換服務

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

change.png

5.編譯OpenCV, 安裝OpenCV 3(時間很長且報錯率很高)

$ make -j4
$ sudo make install
$ sudo ldconfig

install.png

步驟6:

1.檢查OpenCV位置

$ ls -l /usr/local/lib/python3.7/site-packages/

checkcv2.png

二、將opencv編譯獲得的iso文件(在本地python工做目錄下)改名

$ cd /usr/local/lib/python3.7/site-packages/
$ sudo mv cv2.cpython-37m-arm-linux-gnueabihf.so cv2.so #注意這裏的python-37m

三、並放到python虛擬環境(.virtualenvs)的工做文件夾下

$ cd ~/.virtualenvs/cv/lib/python3.7/site-packages/
$ ln -s /usr/local/lib/python3.7/site-packages/opencv-3.3.0.so cv2.so

步驟7:

1.測試 OpenCV 3安裝

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

success.png

從截圖中能夠看到,OpenCV 3已成功安裝在個人Raspberry Pi 3 + Python 3.7環境中web

2.打開 / etc / dphys-swapfile 而後編輯 CONF_SWAPSIZE 變量(改回去)

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE=100
# CONF_SWAPSIZE=1024

changeback.png

3.從新啓動交換服務

$ sudo /etc/init.d/dphys-swapfile中止
$ sudo /etc/init.d/dphys-swapfile開始

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

參考教程:仍是能夠參考Adrian Rosebrock的Accessing the Raspberry Pi Camera with OpenCV and Python
跑通教程的示例代碼(有可能要調整裏面的參數)docker

步驟1:進入python虛擬環境CV

步驟2:pip picamera包

步驟3:跑一下實例代碼便可(其中修改一些參數)

示例代碼1:test_image.pybootstrap

# 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)

test_images.jpg

示例代碼2:test_vedio.pywindows

# 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()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
# allow the camera to warmup
time.sleep(3)
# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
	# grab the raw NumPy array representing the image, then initialize the timestamp
	# and occupied/unoccupied text
	image = frame.array
	# show the frame
	cv2.imshow("Frame", image)
	key = cv2.waitKey(1) & 0xFF
	# clear the stream in preparation for the next frame
	rawCapture.truncate(0)
	# if the `q` key was pressed, break from the loop
	if key == ord("q"):
		break

test_vedeo.jpg


利用樹莓派的攝像頭實現人臉識別

人臉識別有開源的python庫face_recognition,這當中有不少示例代碼
參考教程:樹莓派實現簡單的人臉識別
要求:跑通[face_recognition]的示例代碼facerec_on_raspberry_pi.py以及facerec_from_webcam_faster.py網絡

1.檢查配置,存在dev0便可

ls /dev/video*

lenlian-camera.png

2.庫的安裝(除了安裝完的opencv+bumpy,還須要dlib、face_recognition)

pip install dlib
pip install face_recognition

lenlian-pip.png

3.文件結構

lenlian-file.png

4.代碼實現

finf1.png

find2.png


結合微服務的進階任務

使用微服務,部署opencv的docker容器(要可以支持arm),並在opencv的docker容器中跑通(3)的示例代碼facerec_on_raspberry_pi.py
選作:在opencv的docker容器中跑通步驟(3)的示例代碼facerec_from_webcam_faster.py

使用微服務,部署opencv的docker容器,並在opencv的docker容器中跑通(3)的示例代碼

在樹莓派上安裝docker

#腳本安裝docker
curl -fsSL https://get.docker.com -o get-docker.sh      #下載安裝腳本
sh get-docker.sh --mirror Aliyun      #執行腳本
sudo usermod -aG docker $USER      #填加用戶組,這在樹莓派reboot後docker指令就無需sudo特權了

驗證安裝狀況

docker --version

docker.png

鏡像實現opencv

拉取鏡像,並打開容器

docker-1.png

由於容器內只有python+opencv

因此須要pip一下dlib、face_recognision 和picamera[array]

docker-2.png

容器在退出後全部更新會格式化,因此commit一個pip了所需包的鏡像opencv

docker-3.png

項目樹結構

docker-tree

Dockerfile去build一個鏡像

docker-4.png

建立相關容器並python運行文件

這裏配置信息device即掛載本機攝像頭設備

docker run -it --device=/dev/vchiq --device=/dev/video0 --name myopencv opencv2
python3 facerec_on_raspberry_pi.py

docker-5.png

實現成功

docker-5s.png

選作:在opencv的docker容器中跑通步驟(3)的示例代碼

在Windows系統中安裝XmingPutty。安裝好後,先打開Xming,而後打開Putty,開啓樹莓派的ssh配置中的X11。打開Putty後,把樹莓派的IP地址填在下面這一欄裏,端口用默認的就好了

putty1.png

putty2.png

查看X11是否打開

注:X11forwarding 顯示yes便可

$ cat /etc/ssh/sshd_config

putty3

查看DISPLAY環境變量值

注:這個查看是在用Putty打開的窗口上查看到的,若直接在樹莓派裏的終端看,看到就是"DISPLAY=localhost:10.0"

printenv

printenv.png

編寫run.sh

#sudo apt-get install x11-xserver-utils
xhost +
docker run -it \
        --net=host \
        -v $HOME/.Xauthority:/root/.Xauthority \
        -e DISPLAY=:10.0  \
        -e QT_X11_NO_MITSHM=1 \
        --device=/dev/vchiq \
        --device=/dev/video0 \
        --name facerecgui \
        myopencv \
	python3 facerec_from_webcam_faster.py

打開終端,運行run.sh

sh run.sh

能夠看到在windows的Xvideo能夠正確識別人臉。

docker-6suc.png


遇到的問題

問題1:建立Python虛擬環境出錯(與教程有差別)

問題:

cv-error.jpg

解決方法:

cv-errorfix.jpg

問題2:pip下載速度過慢,特別是numpy、還有picamara[array]等模塊包,下着下載就time out了

numpy-timeout
可見速度之慢
解決方法:
-剛開始不太瞭解pip的時候就無腦掛機乾等,可是解決不了timeout報錯,肝到半夜發現凌晨4點的洛杉磯···網速真快
numpy-success
-後來按羣裏大佬的談話發現,手動複製鏈接去下載whl文件而後放到python3工做目錄下的site-package文件便可
-雖然一開始有想到這個方法,但不知道該文件包放哪才能讓pip找到而無奈勸退...

問題3:編譯

問題:cuda.hpp找不到

q1

該文件的指定路徑其實沒有這個文件,但其實在xfeature2d這個東西在opencv_contrib是能夠找到的
解決:
-有大佬是修改相應路徑
-而咱們選擇暴力複製一個xfeature2d到路徑下便可

問題:ffmpeg?相關問題

q2

解決:
-百度了一下才發現應該是須要添加頭文件
-home/pi/opencv-3.3.0/modules/videoio/src/cap_ffmpeg_impl.hpp下添加

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020

問題:缺乏boostdesc

-這裏可能會缺不少文件,不止截圖中的一個
-緣由彷佛是由於在使用cmake建立build任務的那裏,會出現你所須要的boostdesc部分文件由於網絡沒法鏈接而無法如今

解決:
-網上可找到相應部分的資源,下載解壓而後放進相應路徑下便可

問題:cv2.cpp.co更奇?怪的語法報錯問題


解決:
-使人頭痛的解決問題,編譯問題很長也且容易被跳過(反正可能就是菜看不出來)
-問了羣上大佬才知道須要進入相關文件去修改字符類型(大佬仍是強的,覺得是羣裏某大佬的回答)

編譯問題

分工協做及總結

分工協做

學號 姓名 分工
031702220 黃恆傑 實機操做,博客審定,查閱資料
031702223 鄭志強 博客編寫,查閱資料,尋找解決方法
031702239 林國欽 博客編寫,查閱資料,尋找解決方法

主要經過qq視頻,羣聊進行溝通和資料分享


小結

此次實驗對於opencv的安裝編譯真是吐了...
成功安裝opencv後,可能由於動到電源或是開過久,樹莓派斷連,而後連不上?看指示燈覺得燒壞了仍是啥...
心態差點炸了...重作咯
參照以前的試卷答案,彷佛挺多人選擇直接pip?
可是直接pip下的opencv彷佛是在本地python上運行的而非cv下?這彷佛失去了python虛擬環境的意義
老師說可跑便可?那python2下的直接installopencv不是更爲簡單?這裏的教程安裝py2下的opencv不要太舒服 但慢慢作到後面發現,學docker直接拉取opencv相關鏡像額......那安裝那個東西......emm對的,多動手有好處!

相關文章
相關標籤/搜索