引:
項目需求,在終端攝像頭里嵌入簡單算法,進行圖像預處理,考慮使用Opencv和dlib實現,本博客阿星記錄Opencv在攝像頭中arm開發板交叉編譯與使用的經驗
環境:
主機系統:Ubuntu16.04
Opencv版本: 4.1.0
交叉編譯器:海思Hi3516C V500R001C02SPC010版本編譯鏈,雄邁編譯鏈
自動化編譯工具: cmake version 3.5.1
一、交叉編譯opencv
引:本文使用兩種博主親測方法進行opencv的交叉編譯
下載Opencv
https://opencv.org/releases/page/3/
安裝cmake
sudo apt-get install cmake
sudo apt-get install cmake-gui
安裝基礎
# ubuntu16.04 默認自帶安裝
sudo apt-get install build-essential
# ubuntu16.04 除了git,其他默認自帶安裝
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
# libdc1394-22-dev 需要安裝,其他默認自帶安裝
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
一 >1、方法一
確保已安裝cmake,直接使用下述shell腳本進行一鍵交叉編譯,項目后期博主采用的即本方式,交叉編譯中會出現的問題,方法一二相同,記錄在本博客編譯方法之后
將opencv源碼解壓后,進入opencv目錄,創建build文件夾。將下述build.sh放入該文件夾中,
更改腳本中的BuildDir 路徑,更改腳本中的ToolChain路徑,可自行增刪cmake選項,用於增刪opencv的各模塊,
值得注意的是,下述shell中使用了ARM架構的neon加速,可關注flags選項,ENABLE_NEON, ENABLE_VFPV3等選項
#!/bin/bash set -e # Exit immediately if a command exits with a non-zero status. BuildDir=/home/7hisi/opencv-4.1.0/build ToolChain=/opt/hisi-linux/x86-arm/arm-himix200-linux if [ ! -d "$BuildDir" ]; then # Take action if $BuildDir doesn‘t exists. echo "create ${BuildDir}..." mkdir -p ${BuildDir} fi cd ${BuildDir} echo "building OpenCV4" cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D BUILD_SHARED_LIBS=ON \ -D CMAKE_FIND_ROOT_PATH=${ToolChain}/\ -D CMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake\ -D CMAKE_C_COMPILER=${ToolChain}/bin/arm-himix200-linux-gcc\ -D CMAKE_CXX_COMPILER=${ToolChain}/bin/arm-himix200-linux-g++\ -D CMAKE_CXX_FLAGS="-mfloat-abi=softfp -mfpu=neon"\ -D CMAKE_C_FLAGS="-mfloat-abi=softfp -mfpu=neon"\ -D CMAKE_INSTALL_PREFIX=${BuildDir}/my_install \ -D WITH_TBB=ON \ -D WITH_EIGEN=ON \ -D BUILD_ZLIB=ON \ -D BUILD_TIFF=ON \ -D BUILD_JASPER=ON \ -D BUILD_JPEG=ON \ -D BUILD_PNG=ON \ -D ENABLE_NEON=ON \ -D ENABLE_VFPV3=ON \ -D WITH_LIBV4L=ON \ -D BUILD_opencv_python=OFF\ -D ENABLE_PRECOMPILED_HEADERS=OFF \ -D BUILD_EXAMPLES=OFF \ -D BUILD_TESTS=OFF \ -D BUILD_PERF_TESTS=OFF \ -D BUILD_WITH_DEBUG_INFO=OFF \ -D BUILD_DOCS=OFF \ -D WITH_OPENCL=OFF \ -D WITH_1394=OFF \ ../ make -j$(nproc)
本腳本執行成功后,執行make install,即可在上述shell中配置的CMAKE_INSTALL_PREFIX目錄處,看到交叉編譯生成的include、lib等文件夾
執行shell若出現報錯,可參照下文的報錯表進行解決
至此,opencv交叉編譯完成
一 >2、方法二,使用cmake-gui可視化配置各選項
配置cmake-gui
解壓opencv源碼后,進入目錄創建arm-build文件夾
在終端輸入cmake-gui進入配置界面
在where is the source code處選擇opencv文件夾,
在where to build the binaries選擇剛剛創建的arm-build文件夾,(注意該目錄,之后我們cmake完成,在此文件夾下執行make)
然后點擊左下角的configure。
點擊configure后,在彈出的界面按下圖選擇,即選擇交叉編譯配置。然后點擊next。
點擊next后進行交叉編譯配置,
在compilers下的c和c++處,選擇你的交叉編譯鏈的gcc和g++,
並在Target root處填寫你的交叉編譯工具鏈的安裝位置。
之后點擊finish。
點擊finishi后軟件會配置一段時間,右下角會有進度條
配置完成后在search欄中輸入flags,並在勾選advanced,
然后按下圖進行配置。
將CMAKE_CXX_FLAGS和CMAKE_C_FLAGS: -mfloat-abi=softfp -mfpu=neon, 以開啟Arm下的neon等加速計算
(本步驟其實就是配置了編譯、鏈接選項,需要進一步了解其含義可以百度gcc g++ 后的-參數的含義。)
然后在search框搜索zlib,
在BUILD_ZLIB后打勾,
並選擇ZLIB_INCLUDE_DIR路徑,為你的opencv源碼路徑中的3rdparty/zlib
選中編譯輸出目錄CMAKE_INSTALL_PREFIX (注意該目錄,之后我們編譯完成的包庫等在此目錄尋找)
搜索下列選項並選中
選中BUILD_JPEG
選中WITH_TIFF
選中WITH_PNG
選中BUILD_SHARED_LIBS
選中WITH_TBB
選中WITH_EIGEN
選中ENABLE_NEON
選中ENABLE_VFPV3
取消下列勾選
取消BUILD_TESTS 的勾選
取消BUILD_PERF_TESTS的勾選
取消OPENCV_ENABLE_ALLOCATOR_STATS的勾選(無該選項可忽略)
配置完成后再次點擊configure,
讀條結束后后點擊generate。
之后在arm-build文件夾內就獲得了根據以上步驟配置好的待編譯的交叉編譯源碼。
編譯安裝
在arm-build目錄下進行make
make(若欲開啟並行編譯加速編譯過程,可用 make -j{i},i小於cpu核心數的2倍為宜)
make install
之后我們可以在預設的編譯輸出目錄CMAKE_INSTALL_PREFIX選項目錄下,找到我們的輸出結果
至此。opencv交叉編譯完成
二、編譯錯誤記錄
問題 |
解決方案 |
致命錯誤: dc1394/dc1394.h:沒有那個文件或目錄 |
cmake WITH_1394 不勾選 |
opencv_annotation |
修改3rdparty/libpng/pngpriv.h 128 /* 注釋掉 該行 # if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \*/ 129 # 改為 if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \ |
error while loading shared libraries: libmpc.so.3: cannot open shared object file : No such file or directory
|
export LD_LIBRARY_PATH=<編譯鏈中的lib路徑(存放libmpc.so.3的文件夾路徑)>
|
common.cc:52:2: error: #error "No suitable threading library available." #error "No suitable threading library available.
|
.../opencv-3.4.5/3rdparty/protobuf/src/google/protobuf/stubs/common.cc 中添加下面這一行 #define HAVE_PTHREAD |
arm-xm-linux-gcc -v 報沒有這個文件 |
apt-get install lib32stdc++6 lib32z1 lib32z1-dev |
popd: not found
|
sudo dpkg-reconfigure dash 選no |
'round'/rint' is not a member of 'std;
recipe for target 'modules/gapi/CMakeFiles/opencv_gapi.dir/src/api/gapi_priv.cpp.o' failed |
該gapi模塊的錯誤,可選擇不勾選BUILD_opencv_gapi來解決 |
opencv_annotation模塊,大量的"未定義的引用" |
CMAKE_CXX_FLAGS和 CMAKE_C_FLAGS均改為下面值: (可在cmake-gui中改,或者修改生成的CmakeCache.txt文件中的對應兩行CMAKE_CXX_FLAGS:STRING= 和CMAKE_C_FLAGS:STRING= 的路徑)
-Wl,-rpath-link=/opt/opt/xm_toolchain/arm-xm-linux/usr/lib |
......./libjpeg.so: file not recognized: File not recognized不可識別的文件格式
libtiff和libpng報錯同上 |
已有的jpeg包libpng包libtiff包,為x86_64,,重新下載 jpeg的包, https://jpegclub.org/reference/reference-sources/ http://www.libpng.org/pub/png/libpng.html http://download.osgeo.org/libtiff/ 重新編譯為arm格式,並將編譯好的各so文件和軟連接,拷貝如雄邁庫的lib中
交叉編譯libjpeg png tiff 等包: 在包源碼路徑下:(自行進入各源碼包,自行修改prefix生成輸出路徑,libjpeg和libpng包交叉編譯方法類似,libtiff包交叉編譯需要加上g++編譯器) ./configure --host=arm-linux --prefix=/home/XiongMai/my_jpeg9d/install_armjpeg CC=/opt/opt/xm_toolchain/arm-xm-linux/usr/bin/arm-xm-linux-gcc
./configure --host=arm-linux --prefix=/home/XiongMai/my_jpeg9d/install_armjpeg CC=/opt/opt/xm_toolchain/arm-xm-linux/usr/bin/arm-xm-linux-gcc CXX=/opt/opt/xm_toolchain/arm-xm-linux/usr/bin/arm-xm-linux-g++
make make install 之后將生成路徑下lib的so拷貝至雄邁編譯鏈lib中進行優先尋找 |
libpng、libjpeg、libtiff的'needed .....not found'錯誤 |
該錯誤與上面錯誤中的libpng、libjpeg、libtiff為同源錯誤,均是這三個庫未安裝,或未安裝本編譯鏈平台(如arm)的對應版本所致
同時確保下三者的 XXX_LIBRARY_RELEASE路徑為正確的庫路徑(可參照上述報錯中的方法,交叉編譯這三個庫放入對應路徑中) |
/…/lib/libopencv_core.so: 對‘pthread_spin_init’未定義的引用 對‘pthread_spin_unlock’未定義的引用 對‘pthread_key_create......等
|
此錯誤為平台對於多線程庫pthread的支持問題,有些unix平台無此庫,我們改為lpthread:,具體操作為: CMAKE_EXE_LINKER_FLAGS改為添加-lpthread -lrt -ldl |
三、連接設備
1、連接串口
以windows機器為例:
本電腦右鍵 -> 管理 -> 設備管理器 -> 端口 -> USB Serial Port,記住是COM[x]
若設備管理器中無”端口”一項,而是顯示”其他設備”,例如下圖所示:
為缺少對應的串口驅動程序:
此情況下需要安裝對應的驅動程序,可根據串口類型等,進行串口驅動下載:
如上述我們例子中使用的開發板串口為: CP2102,前往下載對應驅動並安裝:
我們到海思官網中,找到對應的串口驅動進行下載:(內有相關使用文檔,可根據文檔進行串口驅動的下載和使用, windows下基本一直“下一步”即可)
https://www.hisilicon.com/cn/chip-academy/materiallist
2、配置連接串口
以xshell為例,(putty等其他產品配置均如下類似)
打開xshell -> 新建連接 -> 連接【協議】:SERIAL -> 串口【端口號】:COM[x]; 【波特率】:115200
3、輸入賬號密碼
4、配置網絡
設置開發板網絡,使其與欲連接的NFS服務器網絡連通
ifconfig eth0 172.200.97.166 netmask 255.255.248.0 up
5、配置NFS,進行開發板外掛硬盤
5.1 搭建NFS服務器,以windows為例:
下載haneWIN程序,直接下一步安裝即可,附操作參考鏈接:
https://blog.csdn.net/paladinzh/article/details/96162270
在haneWIN程序中,“編輯輸出表文件”里,配置d:\tftp -public -name:nfs將我們windows中的某目錄設置為nfs,以供開發版掛載,外掛調試程序,之后重啟nfs服務器
在windows的“服務”中,看到NFS Server正常運行狀態,則我們nfs的目錄已經設置好了,(亦可在haneWIN程序中的“掛載設備”看到)
5.2 在串口上掛載windows中的nfs目錄
mount -t nfs -o nolock 172.200.97.173:/nfs /mnt/mtd
(其中ip為開啟nfs服務的windows的ip和對應路徑,第二個路徑為本開發板上的路徑)
掛載成功后進入開發板的對應路徑中,即可看到windowsNFS服務器上的目錄文件
取消掛載:umount -f /mnt/mtd