Opencv4.1.0交叉編譯----終端攝像頭內算法嵌入,海思HISI、雄邁ARM編譯鏈使用經驗


引:

    項目需求,在終端攝像頭里嵌入簡單算法,進行圖像預處理,考慮使用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'錯誤

該錯誤與上面錯誤中的libpnglibjpeglibtiff為同源錯誤,均是這三個庫未安裝,或未安裝本編譯鏈平台(arm)的對應版本所致


確保已經勾選了BUILD_PNG、  BUILD_JPEG、BUILD_TIFF,

同時確保下三者的 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服務的windowsip和對應路徑,第二個路徑為本開發板上的路徑)
掛載成功后進入開發板的對應路徑中,即可看到windowsNFS服務器上的目錄文件

取消掛載:umount  -f  /mnt/mtd

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM