[raspberry pi] 編譯OpenCV_contrib


Install OpenCV 3.2 Python/C++ on Raspberry PI

首先先移除舊版本的 libraries
sudo apt-get remove libopencv*
sudo apt-get autoremove
更新系統

sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
sudo reboot
如果你沒有更新你的系統你會需要更多時間。
更新完後要重新開機。
安裝開發工具
sudo apt-get install build-essential cmake cmake-curses-gui pkg-config vim

安裝所需libraries

sudo apt-get install \
  libjpeg-dev \
  libtiff5-dev \
  libjasper-dev \
  libpng12-dev \
  libavcodec-dev \
  libavformat-dev \
  libswscale-dev \
  libeigen3-dev \
  libxvidcore-dev \
  libx264-dev \
  libgtk2.0-dev

Video4Linux

Python以picamera的方式管理樹莓的相機。 你也可以在OpenCV中使用這個模型,但是你必須抓取圖像到numpy.array,並將數組反映到OpenCV Mat。
要使用raspicam的標準抓取影像循環cv2.VideoCapture(0),需要使用Video4Linux驅動程序。
  1. 事前檢查 (執行 sudo raspi-config):
    1. 開啟相機( Interfacing Options > Camera ),設定成 Enable 。
      設定好之後關機並接上相機,在開機。
    2. 設定 gpu_mem  的容量 Advance Options > Memmory Split 設定成 128 分鐘
  2. 安裝 v4l library 
    sudo apt-get -y install libv4l-dev v4l-utils
  3. 啟用核心模組
    sudo modprobe bcm2835-v4l2
  4. 測試模組
    v4l2-ctl --list-devices
    應該會看到
    mmal service 16.1 (platform:bcm2835-v4l2):
             /dev/video0
  5. 測試: 嘗試抓取一個frame,並檢查文件  ~/test.jpg
    v4l2-ctl --set-fmt-video=width=800,height=600,pixelformat=3
    v4l2-ctl --stream-mmap=3 --stream-count=1 --stream-to=~/test.jpg
  6. 訊息:檢查所有可用的控制,如亮度、對比度等:
    v4l2-ctl --list-ctrls
將其正常工作將模塊名 bcm2835-v4l2 加到開機時自動啟動的模組列表中/etc/modules-load.d/modules.conf
sudo vim /etc/modules-load.d/modules.conf
要編輯檔案按 i , bcm2835-v4l2 加到列表中,輸入完畢後先按 Esc ,接著按 Shift +  : ,輸入 wq之後 Enter 退出。

添加其他libraries

sudo apt-get install libatlas-base-dev gfortran

設定 Python

在Raspbian Jessie上,Python 2.7和Python 3都可用。
這裡我們針對這兩個Python版本安裝OpenCV 3.2.0。

安裝 python-dev & numpy

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

開始安裝 OpenCV

下載 OpenCV
請記住,您的剩餘容量最少要有2GB(Linux分區)。
這裡我們安裝在/ home / pi / Download中。
mkdir /home/pi/Download/opencv
cd  /home/pi/Download/opencv
wget https://github.com/opencv/opencv/archive/3.2.0.zip -O opencv_source.zip
wget https://github.com/opencv/opencv_contrib/archive/3.2.0.zip -O opencv_contrib.zip
我們將要安裝 opencv_contrib ,即使這個repo包含新的模塊,通常也沒有穩定的API,而且它們沒有經過很好的測試。

解壓縮檔案

cd /home/pi/Download/opencv
unzip opencv_source.zip
unzip opencv_contrib.zip

編譯 & 安裝 OpenCV

要為C ++,Python2和Python3編譯和安裝OpenCV,我們需要使用CMake。 OpenCV有很多選項可以在編譯時選擇。
您也可以使用命令行開關和/或使用 
ccmake(即基於CMake的用戶界面)來選擇選項。

建立一個新的工作目錄

cd /home/pi/Download/opencv/opencv-3.2.0
mkdir build
cd build

使用命令行開關設定您的配置

cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=/usr/local \
 -D BUILD_WITH_DEBUG_INFO=OFF \
 -D BUILD_DOCS=OFF \
 -D BUILD_EXAMPLES=OFF \
 -D BUILD_TESTS=OFF \
 -D BUILD_opencv_ts=OFF \
 -D BUILD_PERF_TESTS=OFF \
 -D INSTALL_C_EXAMPLES=ON \
 -D INSTALL_PYTHON_EXAMPLES=ON \
 -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.2.0/modules \
 -D ENABLE_NEON=ON \
 -D WITH_LIBV4L=ON \
        ../
CMake應該會開始建立你的配置,等待幾分鐘後你會看見:
.....
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/usbmem/opencv/opencv-3.2.0/build
如果沒有看見 Generating done 那就是中間有發生問題。
查看 MakeError 得知哪邊有問題。
如果配置完成,就可以進行下一個步驟了。

使用CMake TextGUI查看/修改配置

您可以從上面更改某些項目的開關,也可以使用 ccmake 來配置所有可用的選項
$ ccmake ../
                                       Page  1 of ..
 ANT_EXECUTABLE                   ANT_EXECUTABLE-NOTFOUND
 BUILD_CUDA_STUBS                 OFF
 BUILD_DOCS                       OFF
 BUILD_EXAMPLES                   OFF
 BUILD_JASPER                     ON
 BUILD_JPEG                       ON
 BUILD_LIBPROTOBUF_FROM_SOURCES   OFF
 BUILD_OPENEXR                    OFF
 ... more options here ....

Press [enter] to edit option
Press [c] to configure
Press [h] for help           Press [q] to quit without generating
Press [t] to toggle advanced mode (Currently Off)
查看這個清單且更改你需要的選項
當完成所有選項配置後按 c 。
若沒問題可以按
 g 配置makefile。

編譯 OpenCV

可以利用 -jn 在n個核心上面編譯
make -j4
編譯過程需要很長時間...如果出現錯誤,將會停止,否則大約2小時後(在Rasperry 3上),您將看到:
[100%] Built target ...

安裝 OpenCV

這個步驟很快就會進行完成了
sudo make install
sudo ldconfig
恭喜,您的Raspberry PI已經安裝好了!
在預設情況下,檔案會被安裝在:
/usr/local/lib/libcv*
/usr/local/lib/python2.7/dist-packages/cv*
/usr/local/lib/python3.4/dist-packages/cv*
/usr/local/include/opencv2/
/usr/local/bin/opencv_*
/usr/local/share/OpenCV/

測試安裝

利用python 查看版本

$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print (cv2.__version__)
3.2.0 
>>>

測試 C++

測試程式碼,創建一個檔案 test.cpp
 
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
 
using namespace cv;
using namespace std;
 
int main(int argc,char ** argv)
{
  VideoCapture cap(0);
  if (!cap.isOpened()) {
    cerr << "ERROR: Unable to open the camera" << endl;
    return 0;
  }
 
  Mat frame;
  cout << "Start grabbing, press a key on Live window to terminate" << endl;
  while(1) {
    cap >> frame;
    if (frame.empty()) {
        cerr << "ERROR: Unable to grab from the camera" << endl;
        break;
    }
    imshow("Live",frame);
    int key = cv::waitKey(5);
    key = (key==255) ? -1 : key; //#Solve bug in 3.2.0
    if (key>=0)
      break;
  }
 
  cout << "Closing the camera" << endl;
  cap.release();
  destroyAllWindows();
  cout << "bye!" <<endl;
  return 0;
}
編譯指令如下:
g++ $(pkg-config --libs --cflags opencv) -o test test.cpp
執行檔案 ./test 就會看見相機開啟,如果想要看更過範例可以在 /usr/local/share/OpenCV/samples/ 裡查看。
如果相機打不開,請先確認相機是否有連接成功,若未連接成功,要關機接好再重新啟動喔!
參考資料:
http://pklab.net/?id=392&lang=EN
http://open-rotorman.blogspot.tw/2014/06/raspberry-pi-raspberry-pi-devvideo0.html
https://importgeek.wordpress.com/2016/08/27/install-and-configure-opencv-in-code-blocks/

留言