我的環境是UP board、Ubilinux(ubilinux-3.0.iso),自行編譯OpenCV(Open Source Computer Vision Library),我抓的版本是3.1.0。
先更新套件清單並升級:
$ sudo apt-get update
$ sudo apt-get dist-upgrade -y
若是直接安裝現成的套件,指令如下:
$ sudo apt-get install libopencv-dev
不過得到的OpenCV版本通常過舊,因此自行下載原始碼,手動建置編譯。從OpenCV官方的安裝步驟,得知需要先安裝一堆相依套件。
建置與編譯所需工具:
$ sudo apt-get install build-essential gcc cmake pkg-config
抓原始檔需要的工具:
$ sudo apt-get install git
Python相關:
$ sudo apt-get install python python-dev python-numpy
圖形視窗程式庫:
$ sudo apt-get install libgtk2.0-dev
音訊視訊的編解碼、錄製、轉換、串流:
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
圖檔格式(選用性):
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev libjasper-dev
IEEE 1394相機介面(選用性):
$ sudo apt-get install libdc1394-22-dev
TBB(Intel's Threading Building Blocks)(選用性):
$ sudo apt-get install libtbb2 libtbb-dev
接著是OpenCV,原始碼檔案約580 MB,建置後需要2.6 GB,請先確認儲存空間是否足夠。
以git下載位於GitHub的OpenCV原始碼,得到目錄opencv,切換進去:
$ git clone https://github.com/Itseez/opencv.git
$ cd opencv
目前處於最新的版本分支,到OpenCV官網查詢後,得知目前釋出的正式版本為3.1.0,所以決定切換到該分支:
$ git checkout 3.1.0
新增目錄build存放建置結果,切換進去:
$ mkdir build
$ cd build
先執行cmake產生建置需要的設定檔:
$ cmake -DWITH_TBB:BOOL=TRUE -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
其中「-DWITH_TBB:BOOL=TRUE「代表我們想要使用TBB,「-D CMAKE_INSTALL_PREFIX=/usr/local」代表之後要安裝的路徑,最後的「..」代表原始碼所在路徑。
然後開始建置:
$ make -j4
因為UP board的CPU有4顆核心,所以可下參數「-j4」充分利用,相當快,花了不到一小時。
最後終於出現完成的訊息:
...
[100%] Building CXX object modules/calib3d/CMakeFiles/opencv_test_calib3d.dir/test/test_main.cpp.o
Linking CXX executable ../../bin/opencv_traincascade
[100%] Built target opencv_traincascade
Linking CXX executable ../../bin/opencv_test_calib3d
[100%] Built target opencv_test_calib3d
Linking CXX shared module ../../lib/cv2.so
[100%] Built target opencv_python2
然後安裝:
$ sudo make install
執行指令更新程式庫:
$ sudo ldconfig
試著檢查OpenCV的版本:
$ pkg-config --modversion opencv
3.1.0
耶!
然後是是撰寫C++程式,顯示一張圖檔。新增檔案test.cpp,準備一張圖檔test.png,程式內容如下:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char **argv)
{
Mat image = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
namedWindow("test", WINDOW_AUTOSIZE);
imshow("test", image);
waitKey(0);
return 0;
}
以底下兩道指令之一進行編譯:
$ g++ -lopencv_core -lopencv_highgui -lopencv_imgcodecs test.cpp
$ g++ `pkg-config --libs opencv` test.cpp
執行:
$ ./a.out
啊哈,成功囉。
import cv2
img=cv2.imread('test.jpg')
cv2.imshow('test', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
然後執行:
$ python test.py
結果與先前的C++程式相同。
參考資料:
- 葉難: Raspberry Pi:Raspbian編譯OpenCV原始碼,過程都一樣,除了不需要自行編譯TBB的部分。
No comments:
Post a Comment