1. 程式人生 > >Anaconda Python3.6 OpenCV3.3 Ubuntu 16.04原始碼編譯

Anaconda Python3.6 OpenCV3.3 Ubuntu 16.04原始碼編譯

2018.08.22更新:
Mac到手了,環境立馬配起來,先把ffmpeg裝了不然後面讀視訊讀不了。

brew install ffmpeg
brew install pkg-config

pkg-config這個東西有點噁心,裝了ffmpeg還不行,在ccmake裡一直顯示ffmpeg是no,非得裝,opencv還有個專門的issue OpenCV 3.2.0 won’t see ffmpeg on cmake. Versions 3.1.0 and 3.0.0 will,不過不用看那麼多,只要把pkg-config裝好,ccmake上面的ffmpeg就yes了。

然後我還是先裝的python3版的anaconda,cmake命令如下,後面編譯什麼的都一樣不多說了。

cmake -D WITH_IPP=OFF -D PYTHON_DEFAULT_EXECUTABLE=/Users/phd/Softwares/anaconda3/bin/python3 -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D PYTHON3_EXCUTABLE=/Users/phd/Softwares/anaconda3/bin/python3 -D PYTHON3_INCLUDE_DIR=/Users/phd/Softwares/anaconda3/include/python3.6m -D PYTHON3_LIBRARY=/Users/phd/Softwares/anaconda
3/lib/libpython3.6m.dylib -D PYTHON_NUMPY_PATH=/Users/phd/Softwares/anaconda3/lib/python3.6/site-packages ..

口說無憑,給個圖吧(隨便找了個SLAM講課的視訊)
mac0

mac1

2018.07.16更新:
以前把anaconda裝在Documents裡了,強迫症看著不舒服,今天把亂七八糟的資料夾都清理了一下,把原來的anaconda和opencv全刪了,網上下了最新的anaconda 3.5.2和最新的opencv 3.4.2原始碼,按之前的步驟重新編譯了一遍(就改了路徑,下面可以看到我在opt,自己隨意不強求),編譯完了直接sudo make install安裝,基本上沒啥問題。

貼出命令以示清白(如果是別的版本,先看下libpython3.6m.so.1.0等這些東西都在不在,是不是,千萬不要直接拷程式碼硬剛)

cmake -D WITH_IPP=OFF -D PYTHON_DEFAULT_EXECUTABLE=/opt/anaconda3/bin/python3 -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D PYTHON3_EXCUTABLE=/opt/anaconda3/bin/python3 -D PYTHON3_INCLUDE_DIR=/opt/anaconda3/include/python3.6m -D PYTHON3_LIBRARY=/opt/anaconda3/lib/libpython3.6m.so.1.0 -D PYTHON_NUMPY_PATH=/opt/anaconda3/lib/python3.6/site-packages ..

在使用的時候,可能會遇到下面這個小問題需要解決一下:
在編譯完上述新的opencv並安裝之後,我在編譯自己用qt寫的標註工具(用cmake管理的)的時候出現了下面的錯誤:

//opt/anaconda3 libpng16.so.16 對‘[email protected]_1.2.9’未定義的引用

網上一搜,所有的來源基本上都是在編caffe的時候才遇到的這個問題,而所有的答案基本上都來源於下面caffe的這個issue:
https://github.com/BVLC/caffe/issues/6139

我自己的機子根本就沒裝caffe,讓改的Makefile.config是caffe的又不是opencv裡的,搞毛線啊。

後來仔細看下路徑,//opt/anaconda3 前面兩條槓是幾個意思?我以為問題出在路徑這裡,ccmake ..進去看了下,路徑沒問題啊。

接著我以為是那倆庫沒裝,於是conda install libpng zlib…了一波,但是沒卵用,裝得時候問我要不要更新anaconda裡的這幾個庫。。。

再後來想了想,連結問題,估計就是opencv編譯的時候沒帶上這幾位。於是馬上ccmake ..,t一下找到如下flags:

BUILD_ZLIB
BUILD_JPEG
BUILD_TIFF
BUILD_PNG
#上面四個是指從原始碼編譯安裝庫,如果install了可以不用再開

WITH_PNG
WITH_JPEG
WITH_TIFF

ON一波,然後檢視一下上面這些庫的lib和include都指到了正確的位置。接著就是c g, make -j8了,make完了install,跑專案穩的一筆。

總結:ccmake是個好東西

2017.10.16原文:
anaconda pip或者conda直接install opencv-python的opencv版本無法讀取視訊,裝了ffmpeg也沒用,估計是被閹割了,沒辦法只能下原始碼編譯。

重複一下:系統是Ubuntu 16.04;anaconda是python3.6的,裝在了/home/naphid/Documents/anaconda3裡;opencv原始碼版本是3.3。

下完opencv原始碼後解壓,新建一個build資料夾,cd到build;直接輸入cmake .. 不出意外opencv會鏈到系統的python2.7上去(看cache可知),所以需要指定到咱下的anaconda的python3上;另外IPP這個加速包一般被牆了下不來,反正我們也是research不是production,乾脆不要算了。下面的命令複製到終端,實在不行就一行行復制,記得把python所有相關路徑改到自己的anaconda下。 (用ccmake改也行)

cmake 
-D WITH_IPP=OFF 
-D PYTHON_DEFAULT_EXECUTABLE=/home/naphid/Documents/anaconda3/bin/python3 
-D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF 
-D PYTHON3_EXCUTABLE=/home/naphid/Documents/anaconda3/bin/python3 
-D PYTHON3_INCLUDE_DIR=/home/naphid/Documents/anaconda3/include/python3.6m 
-D PYTHON3_LIBRARY=/home/naphid/Documents/anaconda3/lib/libpython3.6m.so.1.0 
-D PYTHON_NUMPY_PATH=/home/naphid/Documents/anaconda3/lib/python3.6/site-packages 
..

從cmake的summary中確認已經成功鏈到想要的地方後,開始編譯。

make -j4

編譯完成後,把編譯出來的cv2.cpython-36m-x86_64-linux-gnu.so庫拷到anaconda的python庫包下;其實不用sudo make install,opencv就已經可以用了,python的warpper都有。

cp /home/naphid/Documents/opencv-3.3.0/build/lib/python3/* ~/Documents/anaconda3/lib/python3.6/site-packages/

終端輸入python,import一下cv2,多半會出錯。

naphid@phdsky:~/Documents/anaconda3/lib/python3.6/site-packages$ python
Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:09:58) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /home/naphid/Documents/anaconda3/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/naphid/Documents/anaconda3/lib/python3.6/site-packages/cv2.cpython-36m-x86_64-linux-gnu.so)

如果出了上面的錯誤`GLIBCXX_3.4.21’ not found,一定是因為gcc庫版本太老,conda裝個。

conda install libgcc

再試一次,import應該沒問題了,然後趕緊試一下能讀視訊否。

import cv2

cap = cv2.VideoCapture('/home/naphid/Documents/phd.avi')

print(cap.isOpened())

while (cap.isOpened()):
    ret, frame = cap.read()
    if frame is None:
        break
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

如果還是不能讀取視訊列印了False的話,估計以前沒裝過ffmpeg視訊解碼相關庫,sudo apt install ffmpeg裝一下,再重來之前所有步驟即可。

之前其實直接把so庫拷過去就能用,但是後來在編譯caffe的時候發現cmake找不到原始碼編的opencv;原因是opencv相關config沒在系統路徑裡,cmake找不到,所以如果要基於opencv編譯其他東西的話,最好還是install一下。

sudo make install