Opencv3.3(Linux)編譯安裝至python的坑


編譯安裝OpenCV絕對是一件讓人發狂的事情,CMake繁多的選項,國內蛋疼的網速,實在讓人無力吐槽,然而為了使用contrib包,我不得不重新編譯他。

OpenCV的編譯

其實OpenCV編譯並不是很難,但是國內蛋疼的網速實在令人無法忍受,首先簡述一下編譯過OpenCV的過程

我的編譯環境是deepin15

准備工作

首先我們用apt安裝必備的庫(雖然大部分我在之前已經安裝過了 orz)

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

以下是可選包

sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

建議大家在官方文檔多看下相關的參數和你需要的語言環境,根據自己具體需要來安裝自己需要的包

創建自己的工作目錄,cd進去clone這兩個庫

cd ~/<my_working_directory>
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

這里需要注意,opencv和contrib必須對應否則編譯會失敗,因此我此處clone了最新的

opencv這兩個庫都相當大,而github的速度相當慢,有一種方法是使用coding.net 或者Oschina導入然后clone,

我在此處通過改CDN來解決訪問不穩定的問題

使用CMAKE從源碼構建項目

1.創建臨時目錄用來存儲我們編譯后的opencv庫,你可以隨意命名,我這用<cmake_build_dir>來表示這個目錄。

cd ~/opencv
mkdir build
cd build

2.構建項目

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

這里列舉了最基礎的兩個參數,編譯類型和安裝目錄。

我這里推薦使用cmake-gui來構建,他能清晰列出可選參數,根據自己需求選擇就行。

安裝cmake-gui

sudo apt-get install cmake-qt-gui
cmake-gui

這里不多贅述cmake-gui的使用,只是列出我使用的參數

cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES=../../opencv_contrib/modules \
-D WITH_LIBV4L=ON \
-D WITH_CUDA=OFF \
..

稍微解釋一下,我之前使用pytorch等深度學習庫時,安裝過CUDA,但是cmake的自動配置有問題,因此我關閉了CUDA,使用默認的OPENCL

LIBV4L是因為構建時找不到videoio.h這個庫,因此可以使用下面的命令來解決

sudo apt-get install libv4l-dev

若是還不能解決可以加入WITH_V4L=OFF這個參數

3.python相關的參數

若是想指定你的python庫安裝路徑請在此處指定參數

PYTHON2(3)_EXECUTABLE = <path to python>#python執行路徑
PYTHON_INCLUDE_DIR = /usr/include/python<version>#python庫所在路徑
PYTHON_INCLUDE_DIR2 = /usr/include/x86_64-linux-gnu/python<version>
PYTHON_LIBRARY = /usr/lib/x86_64-linux-gnu/libpython<version>.so #python本身的動態鏈接文件
PYTHON2(3)_NUMPY_INCLUDE_DIRS = /usr/lib/python<version>/dist-packages/numpy/core/include/ #NUMPY所在位置

因為每個人之前的環境不一樣,你可能要補全一些環境

sudo apt-get install python-numpy
sudo apt-get install python3-numpy
sudo apt-get install libpython-dev libpython3-dev

4.然后就可以等待愉快的配置了。。。。。個頭!!!!!!

國內環境實在太他蛋疼了!!!!!!!!!!!!!!!正值大會,我的梯子在開會前一天突然全部變紅,更是令人蛋疼

IPPICV就是一個那么令我蛋疼的庫,只能直接下載下來放進去了,唉,我的CMAKE配置會將下載的庫 放在編譯目錄的.cache文件夾中,下下來對文件名進行hash放進去就好了,這個庫下載的網址是https://raw.githubusercontent.com/opencv/opencv_3rdparty/a62e20676a60ee0ad6581e217fe7e4bada3b95db/ippicv/ippicv_2017u2_lnx_intel64_20170418.tgz

,實踐關系我們需要對標自己實際情況進行更改。這個庫存的目錄在這https://github.com/opencv/opencv_3rdparty,默認的主分支只提供了readme,你需要更改分支到和你opencv對應的分支下載。

參考了這篇文章

ipp_file=ippicv_2017u2_lnx_intel64_20170418.tgz &&
ipp_hash=$(md5sum ../$ipp_file | cut -d" " -f1) &&
ipp_dir=.cache/ippicv                           &&

mkdir -p $ipp_dir &&
cp ../$ipp_file $ipp_dir/$ipp_hash-$ipp_file

在opencv目錄下進行如上命令即可

可能有些人處出現ffmpeg無法下載的情況,一般使用apt大法

sudo apt-get install ffmpeg-dev

基本可以解決

編譯與安裝

編譯

我在此處沒有任何問題,直接

make -j4

安裝

sudo make install

anaconda安裝cv2

在anaconda安裝cv2時出現了個神奇的錯誤,在命令行調用完美,在使用jupyter時卻出現問題

安裝

其實默認得make install已經將cv2安裝至python目錄下了,但是我要安裝的是anaconda的python,恰巧anaconda的環境變量我是放在系統的python環境變量下的,平時使用source activate root來使用,自然make install並沒有進行安裝。

我們在此處可以拷貝make這一步生成的opencv的動態鏈接文件

如圖 我們將其拷貝至anaconda默認python的庫目錄下

cp cv2.cpython-35m-x86_64-linux-gnu.so ~/anaconda3/lib/python3.6/site-packages/cv.so

之后我使用默認的python調用cv完全沒有問題,但是奇怪的是在jupyter notebook出現了很奇妙的問題

jupyter notebook import Error

我在jupyter調用cv2時出現import error這一報錯

Import error GLIBCXX_3.4.21 not found when importing cv2

大概就是上面這樣子的,沒有保存當時報錯的截圖

GLIBCXX的問題是libgcc鏈接可能在gcc版本更新后鏈接沒更新導致的,一般anaconda使用萬能句法

conda install libgcc

但是這次並沒有解決,

使用下面句子檢查conda默認的libgcc的鏈接

ldd anaconda3/lib/libstdgcc.so.6

或者

strings anaconda3/lib/libstdgcc.so.6 | grep GLIBCXX

如果缺少對應GLIBCXX,使用軟鏈接進行鏈接

cd anaconda3/lib/
mv libstdc++.so.6 libstdc++.so.6.old
ln -s /usr/lib64/libstdc++.so.6  libstdc++.so.6

就當我信心滿滿的打開jupyter使用import cv2時

現實給了我一個狠狠的耳光,import error,這就很尷尬了,到底怎么解決?

更改核

在python的命令行可以運行,jupyter 卻沒法運行,是不是可能jupyter核設置有些問題?

不同環境下kenels存在的目錄可能不同,一下是官方提供的可能的位置.

我的kernel目錄在anaconda3/share/jupyter/kernels/,打開anaconda3/share/jupyter/kernels/python3目錄下的kenel.json進行編輯

修改前

修改后

打開jupyter notebook 運行 import cv2

一切正常.opencv的編譯安裝終於結束了

后記

雖然不知道為什么把環境變量的python改成絕對路徑就ok了(也許是anaconda的python在環境變量的順序在系統后面的原因),但是管他呢,我特碼再也不想配置opencv了.

GFW真(和諧和諧)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM