本文僅記錄個人在使用樹莓派4的opencv時的總結。
0. 主要參考
https://blog.csdn.net/tfb760/article/details/90607234
1. 一些新得
這次安裝中一些新想到的,故此補充。
- 在執行CMAKE這一步時,取消了一些編譯。
認為這些Build沒有用,故取消;cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ //system wide installation. 原來:$cwd/installation/OpenCV-"$cvVersion" \ -D INSTALL_C_EXAMPLES=OFF\ //原來為ON -D INSTALL_PYTHON_EXAMPLES=OFF\ //原來為ON -D WITH_TBB=ON \ -D WITH_V4L=ON \ -D OPENCV_PYTHON3_INSTALL_PATH=$cwd/OpenCV-$cvVersion-py3/lib/python3.5/site-packages \ -D WITH_QT=OFF\ //原來為ON -D WITH_OPENGL=OFF\ //原來為ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D BUILD_EXAMPLES=OFF\ //原來為ON
- 在執行下一步make -j4之前,需要修改swap空間大小,否則編譯到100%時卡死,滑鼠都動不了
sudo vim /etc/dphys-swapfile CONF_SWAPSIZE=100 改成 1024 # 重新開機交換服務 sudo /etc/init.d/dphys-swapfile stop sudo /etc/init.d/dphys-swapfile start
-
在執行make install之前,确定pi4沒有安裝任何opencv的庫。此時查找opencv關鍵字:
隻能在建立的下載下傳路徑和build中找到。同時在
下找到有些相關檔案,/usr/lib/python2.7/ /usr/lib/python3/
-
dmtx庫需要用新的環境進行編譯,否則可能版本不對,提示:
libdmtx.a: file not recognized: file format not recognized.
且編譯後的結果存在了
/usr/local/lib 下
- 在make時,出現:
warning: libImath-2_2.so.12, needed by dir/libopencv_highgui.so, not found, (try using -rpath or rpath-link) warning: libIex-2_2.so.12, needed by dir/libopencv_highgui.so, not found......
等一些列找不到。但查找opencv安裝過程,已經裝過了相關元件。
通過find尋找,能夠在/usr/lib/arm-linux-nnueabihif下找到相關元件,但是版本與warning的不同。可見直接将opencv2的庫搬過來是不行的。還是需要使用opencv4對應的依賴連結庫。
注:後來發現,在執行cmake xxx時,自動檢查了相關依賴項.so的版本,是以采用opencv4的安裝依賴時,不可以使用舊的opencv2生成的相應的so進行連結。
2. 關于CMake的進一步了解
寫了一個小程式,包含opencv_core庫,但代碼中并沒有引用相關函數,此時可以正常編譯,但運作時報錯:
cannot open shared object file
原因是并沒有找到相應的.so檔案,通過ldd xxx可以看出沒有link到相應的庫。
查詢,“You have to distinguish between finding so’s at compile-time and at run-time. ”,在運作時,會按照路徑尋找相應的連結庫,會優先在LD_LIBRARY_PATH尋找,後再PATH下尋找相應連結庫,故将衆多.so檔案安裝目錄添加到環境變量中去。
解決方案:(來自網絡)--------------
方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是退出目前終端後就失效
方法二: 修改~/.bashrc或 ~/.bash_profile或系統級别的/etc/profile
- 在其中添加例如export LD_LIBRARY_PATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH
-
source .bashrc (Source指令也稱為“點指令”,也就是一個點符号(.)。source指令通常用于重新執行剛修改的初始化檔案,使之立即生效,而不必登出并重新登入)
方法三:這個沒有修改LD_LIBRARY_PATH但是效果是一樣的實作動态庫的查找,
- /etc/ld.so.conf下面加一行/usr/local/mysql/lib
-
儲存後執行 ldconfig 生效
(ldconfig 指令的用途,主要是在預設搜尋目錄(/lib和/usr/lib)以及動态庫配置檔案/etc/ld.so.conf内所列的目錄下,搜尋出可共享的動态連結庫(格式如前介紹,lib*.so*),進而建立出動态裝入程式(ld.so)所需的連接配接和緩存檔案.緩存檔案預設為/etc/ld.so.cache,此檔案儲存已排好序的動态連結庫名字清單.)
方法三設定稍微麻煩,好處是比較不受使用者的限制。
由于安裝路徑将衆多的.so庫安裝到了/usr/local/libs,是以加上這個路徑,可以成功運作。
同時被坑的很慘的是,拷貝opencvcv2的代碼到安裝opencv4後,雖然重新修改了動态連結庫的路徑,成功連結,但未修改頭檔案,導緻頭檔案與對應的連結庫不比對。是以需要重新将opencv4生成的include檔案包含到工程中。