本文主要參考了一個外國人寫的博客:
http://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/ 其他系統(tǒng)或平臺可以根據下面這個地址對號入座:
http://www.pyimagesearch.com/opencv-tutorials-resources-guides/ 感覺外國人寫的東西還是比較清楚的,step by step。這篇文章還把每一步所需要的時間也拿出來了,非常貼心。避免在一些要很長時間的步驟傻等在那的尷尬。本文根據第一個網址在裝有Raspbian Jessie 的樹莓派3上編譯openCV。但是還是遇到了一些問題或者與作者描述不同的現象,現在把它記錄下來,針對一些時間超過五分鐘的步驟,筆者也把它標記一下。下面的內容已經默認已經有了一個裝有Raspbian Jessie的樹莓派3,且可以通過SSH或者其他方式可以訪問到樹莓派。
一 查看樹莓派版本
如果不確定樹莓派的系統(tǒng)版本,可以使用 lsb_release -a 命令。
注意,有的網友說使用 uname -a 命令。但是得到的卻不是這里需要的信息。
二 擴張文件系統(tǒng)
使用下面命令打開配置項: sudo raspi-config
并沒有找到原文作者寫的“Expand File System”這一項,并且使用 df -h 命令查看了一下可用空間,由于作者用的8GSD卡,筆者用的是16G的,故大膽猜測,跳過這一步,應該不會有太大問題。
至于原文作者提到為了節(jié)省空間,刪除wolfram-engine,可以節(jié)省600多兆的空間。wolfram-engine用于支持wolfram語言,被捆綁在樹莓派的操作系統(tǒng)中。百度了一把wolfram感覺不明覺厲。
三 安裝依賴文件
1. 更新數據源
sudo apt-get update
sudo apt-get upgrade
這一步實際上才是正式開始的第一步,但是筆者一上來更新數據源就出師不利,第二個命令就出錯了,非常影響心情。
具體的報錯 當時忘了記錄下來,但反正就是更新數據源失敗之類的錯誤,主要問題還是在樹莓派更新景象地址上。樹莓派的鏡像地址存放在 /etc/apt/sources.list 文件中(里面總共三行內容,后兩行被注釋掉)。當然換個國內的源應該沒有問題,但筆者是按照當時網上的一種做法:將該文件第一、二行注釋掉,第三行放出來,如下圖:
這個做法是可以解決上面的報錯問題的。 筆者后面也搜到了一些源,不過擔心安全問題,就沒有用??赡苁枪P者多慮了!
2. 安裝依賴文件
這一步和原文的描述出入最大,很多庫文件都安裝不了,可能還是和上一步的數據源有關。這里僅僅羅列了需要 sudo apt-get 來安裝的庫,沒有或者報"can't locate module XXX"的庫,則直接忽略: build-essential cmake pkg-config libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev
libgtk2.0-dev libatlas-base-dev fortran python2.7-dev python3-dev
四 下載openCV源碼
wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
unzip opencv.zip
wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
unzip opencv_contrib.zip
這一步下載了opencv 和 opencv_contrib的源文件。opencv_contrib中存放了一些opencv中不太穩(wěn)定的內容。但最好保證opencv_contrib和opencv的版本要保持一致。
五 安裝python及虛擬環(huán)境
在Mac上默認安裝了python2.7和python3.6。這里就涉及一個問題:到底是選擇python2 還是python3。由于樹莓派默認是已經安裝了python2.7,當時就想用python2.但是python2 會有一個坑,就是不支持中文編碼,而python3已經支持了中文編碼,所以這里建議還是安裝python3,也可
以都裝一遍。但是如果在一臺機器上,同時安裝了python2 和python3 很容易搞混,所以這里建議使用virtualenv。有點虛擬機的意思,就是提供了一套獨立的python環(huán)境。比如有兩個項目分別要用到不同的環(huán)境,而我們可以根據各自項目需求來配置不同環(huán)境,不用都全局安裝。
1. 安裝pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
如果已經安裝了就可跳過這一步,筆者這里就直接跳過了。
2.安裝virtualenv和virtualenvwrapper
sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip
第二個命令不知道為什么要執(zhí)行,但筆者并沒有找到這個路徑,反正也是要刪除,略過。
3. 配置virtualenv環(huán)境
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
在~/.profile文件的末尾添加上面的內容,此時重新打開終端,就可以執(zhí)行virtualenv相關的命令。如果想在當前終端中生效,也可以執(zhí)行 source ~/.profile 命令。
4. 創(chuàng)建virtualenv工作環(huán)境
mkvirtualenv cv -p python2
mkvirtualenv ovforp3 -p python3
上面分別創(chuàng)建了使用python2 和 python3 的環(huán)境,實際使用時 根據需求選擇其中一個命令執(zhí)
行即可。筆者這里選擇了第二條命令執(zhí)行。
執(zhí)行完后,如果在前面可以看到類似上圖紅框中的字段,則證明當前處于創(chuàng)建的virtualenv工作環(huán)境中。上面的創(chuàng)建命令只用使用一次,即創(chuàng)建該工作環(huán)境時。之后,如果需要重新進入該虛擬
環(huán)境,可以使用下面的workon命令:
workon ovforp3
這時就可以得到類似上圖的現象。
5. 安裝Numpy
pip install numpy
這里沒什么可講,記錄一下,之前在python2環(huán)境中編譯時,這里一直安裝失?。粨Q成python3環(huán)境后,就沒有問題。
六. 編譯 安裝 OpenCV
1. 配置編譯項
編譯前確定當前是處于虛擬工作環(huán)境中,然后執(zhí)行下面的命令:
cd ~/opencv-3.1.0/
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
-D BUILD_EXAMPLES=ON ..
這里首先創(chuàng)建了一個build的目錄,進入該目錄,并執(zhí)行后面的cmake命令。這個build不知道有什么用,反正從頭到最后 也沒看到里面有什么內容。但是如果不在這里執(zhí)行cmake命令,又會報錯。姑且這么干吧! 可以看見Cmake命令后面跟了長串參數。大家可以根據名字猜測用處。其中OPENCV_EXTRA_MODULES_PATH的值可以根據實際的路徑進行修改。其他的保持不變。
其次 BUILD_EXAMPLES的值后面 有一個“..”(表示上一級),不要忘了。忘了也會出錯。
按照原文多說法,這里會得到類似下面的結果:
筆者也確實得到了,但其中的Interpreter一欄并沒有指向像上圖中的虛擬環(huán)境中的地址,而是直接指向了本機的實際地址。這種現象,原文的解釋是當前的工作環(huán)境沒有切到對應的虛擬環(huán)境中,所以使用workon命令做一下切換就可以了。但筆者試了好幾次,仍然不行。這讓人很納悶,只能先忽略這個問題。
2. 執(zhí)行編譯
先退回到opencv源代碼的根目錄,然后執(zhí)行 make 命令即可。正如原文作者所說,使用
make -j4 執(zhí)行一段時間后 由于爭搶內核場景的原因會報錯。那么老老實實用make命令吧。
執(zhí)行這個編譯命令非常耗時。筆者編過三次,每次的時間至少都在一個小時以上,所以,大家可以干點其他事,再來看結果。
上面也說了,筆者編了三次,肯定不會沒事閑的慌,編三次。說明上面的命令有問題。真是坑呀。編了一個小時多,然后就編不過了??纯闯鲥e信息:
stitching_detailed.cpp:(.text+0x188c): undefined reference to `cv::detail::SurfFeaturesFinderGpu::SurfFeaturesFinderGpu(double, int, int, int, int)'
這就讓人蒙了,突然來一個找不到函數。搜了好久,發(fā)現了一個帖子,很有啟發(fā):
https://devtalk.nvidia.com/default/topic/766474/opencv4tegra-sourcecode-anyone-/
總結一下,就是這里在編譯 example目錄時,由于缺少了opencv4tegra類庫。兩種方法:要么安裝缺少的類庫,要么在編譯選項時不編譯這部分內容。 考慮到上面的帖子的描述并不是針對樹莓派環(huán)境,且這部分內容只是example,不影響openCV核心功能,所以決定使用第二種方法。這里需要退到上一步重新執(zhí)行cmake命令,修改后的cmake命令如下:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \
-D BUILD_EXAMPLES=OFF ..
再次執(zhí)行make問題,就不會報錯了。
3. 安裝
sudo make install
sudo ldconfig
4.驗證
在/usr/local/lib/python3.4/site-packages/或者/usr/local/lib/python3.4/dist-packages路徑下(二選一)中可以找到cv2.cpython-34m.so文件(在python2中是cv2.so文件)。將它的名字改回cv2.so,并在當前的虛擬工作環(huán)境中建立軟連接。
sudo mv cv2.cpython-34m.so cv2.so
cd ~/.virtualenvs/cv/lib/python3.4/site-packages/
ln -s /usr/local/lib/python3.4/site-packages/cv2.so cv2.so
此時,在終端輸入python,進入python交互式命令行,看能否打印出cv2的版本號,如下圖:
大功告成。