樹莓派OpenCV系列教程01:開發(fā)環(huán)境搭建

PS:本章將介紹OpenCV開發(fā)環(huán)境的搭建,搭建的版本為OpenCV4.1.0,同時(shí)支持Python3和C++,在搭建好后,將通過一個(gè)C++和Python的Demo打開CSI攝像頭來測(cè)試開發(fā)環(huán)境是否搭建完成。

1 燒錄系統(tǒng)
本教程采用的鏡像是樹莓派官方2019年7月10日發(fā)布的發(fā)行版鏡像,代號(hào)Buster,如下圖所示:

2 基本設(shè)置
2.1 把目錄擴(kuò)展到整個(gè)TF卡
本章將介紹OpenCV開發(fā)環(huán)境的搭建,搭建的版本為OpenCV4.1.0,同時(shí)支持Python3和C++,在搭建好后,將通過一個(gè)C++和Python的Demo打開CSI攝像頭來測(cè)試開發(fā)環(huán)境是否搭建完成。
運(yùn)行指令:sudo raspi-config


2.2 開啟攝像頭
作為開源計(jì)算機(jī)視覺庫,主要進(jìn)行圖像處理,對(duì)攝像頭圖像數(shù)據(jù)進(jìn)行處理是主要需求,因此,開啟攝像頭是很有必要的。
2.2.1 啟用攝像頭
sudo raspi-config
進(jìn)入Interfacing Options->Camera->Yes,即可啟用攝像頭。
檢測(cè)攝像頭是否正常,可以使用以下命令進(jìn)行檢測(cè):
raspivid -t 0 -cs 0
2.2.2 準(zhǔn)備視頻流設(shè)備
在OpenCV中,若要讀取攝像頭數(shù)據(jù),需要開啟v4l2(video for linux 2),開啟后,攝像頭設(shè)備文件為/dev/video0,OpenCV將從該文件中讀取視頻流文件。
開啟方法如下:
sudo vim /etc/modules
在末尾添加一行:
bcm2835-v4l2
2.3 更換軟件源
鑒于國內(nèi)網(wǎng)絡(luò)環(huán)境下載各大鏡像,軟件包速度慢的問題,需要更換軟件源,以防下載慢,且在本教程中,統(tǒng)一更換為清華源。
2.3.1 更換樹莓派軟件源
包括系統(tǒng)源與系統(tǒng)更新源,操作方法:
# 編輯 `/etc/apt/sources.list` 文件,刪除原文件所有內(nèi)容,用以下內(nèi)容取代:?
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib?
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib?
# 編輯 `/etc/apt/sources.list.d/raspi.list` 文件,刪除原文件所有內(nèi)容,用以下內(nèi)容取代:?
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
如下圖所示:


2.3.2 更換pip軟件源
為加速Python pip安裝速度,特更改Python軟件源,操作方法:
pip install pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
清華軟件源Pypi官方說明
2.4 重啟
以上步驟均完成之后,需要進(jìn)行重啟才生效,重啟命令如下:
sudo reboot
3 安裝OpenCV所需要的庫
3.1 安裝numpy
sudo pip3 install numpy
3.2 安裝OpenCV所需的依賴
sudo apt-get install build-essential git cmake pkg-config -y
sudo apt-get install libjpeg8-dev -y
sudo apt-get install libtiff5-dev -y
sudo apt-get install libjasper-dev -y
sudo apt-get install libpng12-dev -y
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev -y
sudo apt-get install libgtk2.0-dev -y
sudo apt-get install libatlas-base-dev gfortran -y
4 下載OpenCV
本次安裝的OpenCV版本為OpenCV 4.1.0,官方鏈接地址
需要下載包括OpenCV與OpenCV_Contrib兩個(gè)倉庫
OpenCV_4.1.0倉庫:Github地址
OpenCV_Contrib_4.1.0倉庫:Github地址
鑒于下載速度慢,建議采用Git Bash下載:
下載命令如下,注意添加—recursive及-b 4.1.0
git clone -b 4.1.0 --recursive https://github.com/opencv/opencv.git
git clone -b 4.1.0 --recursive https://github.com/opencv/opencv_contrib.git
下載后,建議采用Fillzilla或者U盤等方法把文件傳輸?shù)綐漭芍小?/p>
當(dāng)然,也可以直接在樹莓派命令行窗口執(zhí)行以上命令進(jìn)行下載,但請(qǐng)確保網(wǎng)絡(luò)穩(wěn)定。
5 配置Cmake
Cmake是一款跨平臺(tái)的編譯工具,經(jīng)過配置,可輸出適配于樹莓派平臺(tái)的Makefile
cd /home/pi/Downloads/opencv-4.1.0
mkdir build
cd build
配置Cmake,執(zhí)行以下命令:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/pi/Downloads/opencv-4.1.0/opencv_contrib-3.4.0/modules \
-D BUILD_EXAMPLES=ON \
-D WITH_LIBV4L=ON \
-D PYTHON3_EXECUTABLE=/usr/bin/python3.7 \
-D PYTHON_INCLUDE_DIR=/usr/include/python3.7 \
-D PYTHON_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython3.7m.so \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \
..
注意,以上命令需要根據(jù)您具體的軟件環(huán)境進(jìn)行修改,否則很可能報(bào)錯(cuò)。
其中:
CMAKE_BUILD_TYPE=RELEASE \ 代表編譯類型為發(fā)行版本
CMAKE_INSTALL_PREFIX=/usr/local \ 安裝路徑
INSTALL_C_EXAMPLES=ON \ C demo
INSTALL_PYTHON_EXAMPLES=ON \ Python demo
OPENCV_EXTRA_MODULES_PATH=/home/pi/Downloads/opencv-4.1.0/opencv_contrib-3.4.0/modules \ OpenCV Contrib路徑
BUILD_EXAMPLES=ON \ 編譯demo
WITH_LIBV4L=ON \ 開啟Video for Linux
PYTHON3_EXECUTABLE=/usr/bin/python3.7 \ Python3路徑
PYTHON_INCLUDE_DIR=/usr/include/python3.7 \ Python3 include文件夾
PYTHON_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpython3.7m.so \ Python3庫
PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \ Python3 Numpy安裝路徑
..
如下圖所示:

cmake 配置完成后的界面如下圖所示:

6 編譯
在Cmake生成Makefile之后,便可進(jìn)行編譯:
輸入并執(zhí)行:
make
即開始進(jìn)行編譯,編譯過程如下圖所示:

7 安裝
輸入以下命令即可進(jìn)行安裝:
sudo make insall
注意:install安裝時(shí)間一般在1分鐘左右。
8 測(cè)試是否安裝完成
測(cè)試包括Python及C++的測(cè)試,用到了攝像頭及簡單的OpenCV處理函數(shù)。
8.1 Python3:

#!/usr/bin/env python
'''
Waveshare OpenCV Tutorial
00_Test_OpenCV.py
A demo to show whether The OpenCV and CSI camera is well installed
'''
import numpy as np
import CV2
def main():
? ? print("OpenCV Version:{}".format(CV2.__version__))
? ? # 0: use CSI camera,1:use USB camera
? ? cap = CV2.VideoCapture(0)
? ? if(not cap.isOpened()):
? ? ? ? print("can't open this camera")
? ? while(True):
? ? ? ? ret, FrameImage = cap.read()
? ? ? ? if ret == True:
? ? ? ? ? ? # change to gray image
? ? ? ? ? ? GrayImage = CV2.cvtColor(FrameImage, CV2.COLOR_BGR2GRAY)
? ? ? ? ? ? # blur the image?
? ? ? ? ? ? BlurImage = CV2.blur(GrayImage,(7,7))
? ? ? ? ? ? # use canny to detect contour
? ? ? ? ? ? CannyImage = CV2.Canny(BlurImage,3,9)
? ? ? ? ? ? # show the image
? ? ? ? ? ? CV2.imshow('Camera Capture',CannyImage)
? ? ? ? ? ? #Press Q to quit
? ? ? ? ? ? if (CV2.waitKey(1)) == ord('q'):
? ? ? ? ? ? ? ? cap.release()
? ? ? ? ? ? ? ? break
? ? ? ? else:
? ? ? ? ? ? break
if __name__ == '__main__':
? ? print(__doc__)
? ? main()
? ? # Release resource
? ? CV2.destroyAllWindows()

執(zhí)行該P(yáng)ython腳本的情況如下:

8.2 C++:

#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
? ? cout << "Waveshare OpenCV Tutorial"<< endl;
? ? cout << "00_Test_OpenCV"<cout << "A demo to show whether The OpenCV and CSI camera is well installed" <cout << endl;
? ? cout << "OpenCV Version:" << CV_VERSION << endl;
? ? // 0: use CSI camera,1:use USB camera
? ? VideoCapture cap(0);
? ? if(!cap.isOpened())
? ? {
? ? ? ? cout<<"can't open this camera"<return -1;
? ? }? ??
? ? Mat FrameImage,GrayImage,BlurImage,CannyImage;
? ? while(1)
? ? {
? ? ? ? cap>>FrameImage;
? ? ? ? //Change to gray image
? ? ? ? cvtColor(FrameImage,GrayImage,COLOR_BGR2GRAY);
? ? ? ? //blur the image
? ? ? ? blur(GrayImage,BlurImage,Size(7,7));
? ? ? ? //use canny to detect contour
? ? ? ? Canny(BlurImage,CannyImage,3,9);
? ? ? ? //show the image
? ? ? ? imshow("Camera Capture",CannyImage);
? ? ? ? //Press Q to quit
? ? ? ? if(char(waitKey(1)) == 'q')
? ? ? ? {
? ? ? ? ? ? break;
? ? ? ? }
? ? }
? ? return 0;
}

CMakeLists.txt:
cmake_minimum_required(VERSION 3.0)?
project(00_Test_OpenCV)?
find_package(OpenCV REQUIRED)?
add_executable(00_Test_OpenCV 00_Test_OpenCV.cpp)?
target_link_libraries(00_Test_OpenCV ${OpenCV_LIBS})
編譯并運(yùn)行:

9 結(jié)語
若中途有安裝失敗,或多次嘗試安裝失敗,不想浪費(fèi)時(shí)間在搭建環(huán)境上,可直接使用我們提供的鏡像,在我們提供的鏡像中,除了已安裝OpenCV4.1.0之外,還安裝了TensorFlow和Keras,如下圖所示:

鏈接:https://pan.baidu.com/s/1e1neaOQQhug-SL9zDofzKQ
提取碼: 4mw6
擴(kuò)展名為.z01的文件是zip文件的分卷,請(qǐng)同時(shí)下載兩個(gè)文件,并將其放到同一個(gè)文件夾下,然后解壓zip文件,即可得到鏡像,大概15G左右,然后使用燒錄工具燒寫該鏡像即可。
?