在ubuntu18.04下將opencv(含contrib)安裝到anaconda搭建的虛擬python環境中(ubuntu18.04+anaconda+python3.5+opencv3.1.0)

        在文章開始前首先感謝這篇博文ubuntu+anaconda環境下opencv+contrib源碼編譯:剛脫坑,寫一篇實實在在的編譯教程及其作者Synioe,寫得非常詳細,而且真實可用。中間我出現了一些與Synioe大佬不太一樣的小錯誤,不過最終也都找到了解決方案。

1.下載並安裝anaconda,然後創建一個虛擬環境(我將我的新環境命名爲caffe,並安裝了python3.5;另外很重要的,要安裝numpy,用anaconda的命令即可,如我的就是:conda install -n caffe numpy,因爲網速的原因,可能會安裝失敗,沒關係,多執行這個命令幾次就好,總會成功的)。網上教程很多,這裏就不多說了。

2.下載opencv3.1.0和opencv_contrib-3.1.0的source包。網址如下:

    opencv-3.1.0

    opencv_contrib-3.1.0(有zip和tar兩種壓縮模式,只選其中一種就好)

     然後解壓縮:首先解壓opencv-3.1.0(我解壓到了我的  "~/File"  文件夾下),然後將opencv_contrib-3.1.0解壓到剛纔的opencv-3.1.0下,即目錄關係爲:~/File/opencv-3.1.0/opencv_contrib-3.1.0。

3.然後對opencv進行編譯:

    這裏也就是我糊塗的地方,我一直想知道,我應該在anaconda新搭建的caffe環境下編譯,還是在計算機環境的base中編譯呢?在不同的環境中對opencv進行編譯,會有區別嗎?是不是如果我在base環境下編譯,那麼就無法鏈接到caffe環境下的python中呢?

    上網查anaconda的講解,也沒有人提到過這個問題。後來經過摸索+猜測,大概明白了:在哪個環境下編譯不重要,重要的是編譯前的cmake選項要選對,比如python的版本、python存放的路徑等等,一定要選對。比如我想對caffe環境下的python3.5安裝opencv,那麼我在編譯opencv的時候,python的路徑就一定要選/home/pi(pi是我在ubuntu下的用戶名)/anaconda3/envs/caffe/lib/python3.5,而不能選base環境下的python路徑。另外還有其他的一些注意事項,等一下再說。

    明白了這一點,就可以放心大膽得進行編譯了。(但是,以防萬一,我以下操作全都是在anaconda新搭建的caffe環境下進行操作的

    首先安裝依賴項:這裏提一下,依賴項也是在哪個環境下安都可以,因爲它最終都會給你安到計算機原本的base環境下。

sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev libxvidcore-dev libx264-dev 

    這裏可能會出現libjasper-dev安裝不上的問題,請大家自行上網搜索解決方案,很簡單的。

    依賴項都安裝好後,進入"opencv-3.1.0"文件夾,建立並進入build文件夾:

mkdir build && cd build

    然後在build目錄下進行編譯,首先設置編譯前選項:(這一點很重要,再次感謝博主Synioe)

   

cmake -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_V4L=ON -D WITH_OPENGL=ON -D WITH_VTK=ON -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=/home/pi//File/opencv-3.1.0/opencv_contrib-3.1.0/modules -D WITH_IPP=OFF -D PYTHON_DEFAULT_EXECUTABLE=/home/pi/anaconda3/envs/caffe/lib/python3.5 -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D PYTHON3_EXCUTABLE=/home/pi/anaconda3/envs/caffe/lib/python3.5 -D PYTHON3_INCLUDE_DIR=/home/pi/anaconda3/envs/caffe/include/python3.5m -D PYTHON3_LIBRARY=/home/pi/anaconda3/envs/caffe/lib/libpython3.5m.so.1.0 -D PYTHON_NUMPY_PATH=/home/pi/anaconda3/envs/caffe/lib/python3.5/site-packages -D BUILD_EXAMPLES=ON -D BUILD_LIBPROTOBUF_FROM_SOURCES=ON -D BUILD_opencv_hdf=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF -D BUILD_TESTS=OFF ..
(pi是我在ubuntu下的用戶名)
(注意,這一步不是直接複製粘貼就行的,這裏面有很多路徑,大家要把我的路徑修改掉,改稱你們電腦中的路徑,比如PYTHON3_EXCUTABLE=/home/pi/anaconda3/envs/caffe/lib/python3.5,大家要改稱PYTHON3_EXCUTABLE={你的anaconda3所在的文檔}/anaconda3/envs/caffe/lib/python3.5)

   

這一步運行時,會出現一大段文字,一定要確保其中有如下方框中的文字:(路徑可以不一樣,但一定要有有路徑,不能讓它顯示"NO")

中間如果出現錯誤,請大家自行百度或google。遇到難解決的問題,多看幾篇帖子,總會解決的。

完成以後:

make 
sudo make install
sudo ldconfig

4.將opencv關聯到anaconda下caffe環境中的python3.5:

    搜索cv2.cpython-35m-x86_64-linux-gnu.so文件:

sudo find / -name "cv2.cpython-35m-x86_64-linux-gnu.so"

    我這邊彈出了兩個路徑:

    /usr/local/lib/python3.5/site-packages/cv2.cpython-35m-x86_64-linux-gnu.so
    /home/pi/File/opencv-3.1.0/build/lib/python3/cv2.cpython-35m-x86_64-linux-gnu.so

    盲猜第一個,最後發現猜中了(不要問我原因,因爲我也不知道)。如果你的路徑跟我不一樣,反正就選某個python路徑下的cv2.cpython-35m-x86_64-linux-gnu.so就對了,不要選其他路徑下的(比如我第二個路徑是opencv下的,一看就不靠譜:我是要把python關聯到opencv,又不是把opencv關聯到opencv)。

    進入第一個"cv2.cpython-35m-x86_64-linux-gnu.so"的文件夾:

sudo su
cd /usr/local/lib/python3.5/site-packages

    將其中的"cv2.cpython-35m-x86_64-linux-gnu.so"複製一份,並改名爲"cv2.so":

cp cv2.cpython-35m-x86_64-linux-gnu.so cv2.so

    進入你anaconda下caffe環境中python3.5的"site-packages"文件夾,並對上面剛創建的cv2.so建立軟鏈接:

   

cd home/你的用戶名/anaconda3/envs/caffe/lib/python3.5/site-packages
ln -s /usr/local/lib/python3.5/site-packages/cv2.so cv2.so

5.之後,在caffe環境下進入python,嘗試import cv2,可能還會出錯。比如我的是:

    ImportError: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory

    這時候,要去找" libpython3.5m.so.1.0"所在的路徑(每個人情況不同,你們的可能不是" libpython3.5m.so.1.0"):

sudo find / -name " libpython3.5m.so.1.0"

    這時候會出來一到兩條路徑:假設爲 "XXXXXX1","XXXXXX2"。

   然後,進入如下文件夾,並新建一個文本opencv.conf:

sudo su
cd /etc/ld.so.conf.d
nano opencv.conf

   在打開的文本中寫入如下:

/usr/local/lib
XXXXXX1
XXXXXX2

按control + o保存,再按control + x退出,保存後退出,再次輸入:

sudo ldconfig -v

然後應該就沒問題了。

輸入python,然後import cv2嘗試一下吧。

 

=====================================make過程中出現的錯誤=============================================

以前出現的錯誤都比較好解決,但是這次出現了一個以前沒見過的錯誤:

modules/core/CMakeFiles/opencv_test_core.dir/build.make:854: recipe for target 'bin/opencv_test_core' failed
make[2]: *** [bin/opencv_test_core] Error 1
CMakeFiles/Makefile2:1960: recipe for target 'modules/core/CMakeFiles/opencv_test_core.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2
Makefile:160: recipe for target 'all' failed
make: *** [all] Error 2

經谷歌,是因爲anaconda中自帶的依賴包libtiff把我安裝到電腦的usr/lib中的依賴包libtiff給隱藏了,解決方法是卸載anaconda中的這個依賴包,命令如下:

首先用conda deactive跳出自建的環境,然後運行如下命令 :
conda uninstall libtiff
(中間可能會出現網絡錯誤,需多次嘗試)]
命令完成後,用make clean清除之前make生成的文件,然後刪除build文件,再重建build文件,重新設置編譯前選項,並make.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章