天天看點

Raspberry Pi 4使用Opencv更新0. 主要參考1. 一些新得2. 關于CMake的進一步了解

本文僅記錄個人在使用樹莓派4的opencv時的總結。

0. 主要參考

https://blog.csdn.net/tfb760/article/details/90607234

1. 一些新得

這次安裝中一些新想到的,故此補充。

  1. 在執行CMAKE這一步時,取消了一些編譯。
    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
               
    認為這些Build沒有用,故取消;
  2. 在執行下一步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
               
  3. 在執行make install之前,确定pi4沒有安裝任何opencv的庫。此時查找opencv關鍵字:

    隻能在建立的下載下傳路徑和build中找到。同時在

    /usr/lib/python2.7/
    /usr/lib/python3/
               
    下找到有些相關檔案,
  4. dmtx庫需要用新的環境進行編譯,否則可能版本不對,提示:

    libdmtx.a: file not recognized: file format not recognized.

    且編譯後的結果存在了

    /usr/local/lib 下

  5. 在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

  1. 在其中添加例如export LD_LIBRARY_PATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH
  2. source .bashrc (Source指令也稱為“點指令”,也就是一個點符号(.)。source指令通常用于重新執行剛修改的初始化檔案,使之立即生效,而不必登出并重新登入)

    方法三:這個沒有修改LD_LIBRARY_PATH但是效果是一樣的實作動态庫的查找,

  3. /etc/ld.so.conf下面加一行/usr/local/mysql/lib
  4. 儲存後執行 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檔案包含到工程中。