日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

四、SLAM学习笔记—— Ubuntu18.04交叉编译OpenCV4.5.5至ARM64位平台firefly-RK3566

發布時間:2024/3/12 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 四、SLAM学习笔记—— Ubuntu18.04交叉编译OpenCV4.5.5至ARM64位平台firefly-RK3566 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述: 交叉編譯大概的意思是指: 在PC(x86_x64)的機器上編譯其他平臺如ARM平臺的代碼,這個過程叫做交叉編譯。對于交叉編譯,我們首先確定目標平臺的架構,RK3566的架構是ARMv8,64位的執行狀態。aarch64的介紹可以參考:[https://blog.csdn.net/tanli20090506/article/details/71435777]官方的Linux的SDK中,提供的編譯器為:

整個交叉編譯工程從大的步驟上講其實很簡單,就是細節的坑有一些,總體步驟:1)下載OpenCV的代碼 2) 用CMake-GUI工具配置編譯配置 3) 利用gcc-aach64編譯代碼得到動態庫so 4) 編譯程序在RK3566開發板運行。

一、下載OpenCV4.5.5代碼和OpenCV Contributed代碼

OpenCV: 官網下載

OpenCV Contribute :?https://github.com/opencv/opencv_contrib/archive/4.5.5.zip

1.2 啟動cmke-gui

1.3 配置源代碼目錄和生成目錄Build

點擊Config:

配置opencv_contribute目錄:

1.4

運行后可以看到代碼正在編譯:

二、CMake-GUI的配置?

三、OpenCV代碼的編譯

編譯OpenCV4.5.5出現的錯誤:

../../lib/libopencv_world.so.4.5.3: undefined reference to `png_do_expand_palette_rgb8_neon' ../../lib/libopencv_world.so.4.5.3: undefined reference to `png_init_filter_functions_neon' ../../lib/libopencv_world.so.4.5.3: undefined reference to `png_do_expand_palette_rgba8_neon' ../../lib/libopencv_world.so.4.5.3: undefined reference to `png_riffle_palette_neon' collect2: error: ld returned 1 exit status apps/model-diagnostics/CMakeFiles/opencv_model_diagnostics.dir/build.make:95: recipe for target 'bin/opencv_model_diagnostics' failed make[2]: *** [bin/opencv_model_diagnostics] Error 1 CMakeFiles/Makefile2:3183: recipe for target 'apps/model-diagnostics/CMakeFiles/opencv_model_diagnostics.dir/all' failed make[1]: *** [apps/model-diagnostics/CMakeFiles/opencv_model_diagnostics.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs....

對應的解決方案:打開opencv源碼目錄,編輯文件?vim 3rdparty/libpng/pngpriv.h
第130行注釋掉, 修改為131行

/* # if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \ */ # if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \defined(PNG_ALIGNED_MEMORY_SUPPORTED) # define PNG_ARM_NEON_OPT 2 # else # define PNG_ARM_NEON_OPT 0 # endif #endif

該解決方案親測可行,參考博文:https://blog.csdn.net/u010571709/article/details/122103591

四、編譯OpenCV的DEMO在板子上運行

創建一個main.c的OpenCV的DEMO程序,實現的功能是將普通的圖像轉換為黑白二值化的圖像。

#include <iostream> #include "opencv2/opencv.hpp" #include "opencv2/calib3d/calib3d.hpp" using namespace std; using namespace cv; int main() {Mat imag, result;imag = imread("mv3.jpg",16);result = imag.clone();threshold(imag, result, 100, 250, THRESH_OTSU);imwrite("huidu.jpg",result);return 0; }

直接編寫一個簡單的命令調用aarch64-g++編譯上邊的程序:

/home/wzw/rk3566/rk_cross_compile_tool/bin/aarch64-linux-gnu-g++ -g -std=c++11 test.cpp \-o test_opencv.out \-I/home/wzw/rk3566/rk3566_opencv/include \-L/home/wzw/rk3566/rk3566_opencv/lib \-lopencv_core \-lopencv_imgcodecs \-lopencv_imgproc

-I : 指定包含頭文件的位置

-L: 指定庫文件所在的位置

-l : 指定庫的名稱。雖然完整的名稱是libopencv_core.so 但是我們不寫后綴名,也寫前邊的lib。

五、編譯程序在RK3566上的運行

5.1?運行.out 提示: no such file or directory

? ? ? ? 本次交叉編譯編譯出.out文件,但是運行的時候提示no such file or directory,最終經過排查懷疑是編譯的程序無效(編譯器的架構選錯), 后續選RK3566 SDK提供的交叉編譯工具編譯代碼沒出現這該情況。

5.2?error while loading shared libraries: xxx.so.x

? ? ? ? 當我解決了5.1的問題后,隨之而來的是無法正確加載so庫。這是因為我以為linux和windows相同,都會默認加載可執行文件同目錄的so文件。實際上linux默認情況下并不會先在當前目錄下搜尋so庫,從而導致error while loading shared libraries。

? ? ? ? 可以通過ldd命令查看程序依賴庫情況,樣例如下所示,由于RK3566開發板不好截圖,用其他博客的圖[linux加載動態庫問題_黃粱一夢-CSDN博客_linux加載動態庫]代替:

5.3讓Linux在當前目錄下調用so庫文件

? ? ? ? Linux系統在當前目錄下調用so文件:默認情況下Linux系統不在會當前系統下尋找程序需要加載的Library文件,這點和windows并不相同,windows會優先從程序的當前目錄下搜尋dll并嘗試加載。這個有時候并不方便調試代碼。一個簡單的方式是:Ctrl + Alt + T打開命令行,輸入:

# 臨時修改,log out之后就失效 export LD_LIBRARY_PATH=./

? ? ? ? 如果需要任何時候都優先在當前目錄搜尋Library,那么按下面的方法:

# 讓當前帳號以后都優先加載當前目錄的動態庫 修改~/.bash_profile在文件末尾加上兩行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH # 讓所有帳號從此都優先加載當前目錄的動態庫 修改/etc/profile在文件末尾加上兩行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH

5.4?鏈接庫的時候,提示load shared libraries error,xxx file too short

? ? ? ? 經過前面的步驟,終于可以看到系統在嘗試記載本地的so庫,但是加載庫的時候提示庫太短了。原因:程序鏈接的動態庫中有軟連接,但是軟連接沒有(l)標識,被識別成了實際的動態庫文件,軟連接文件又太小,所以就成了too short,解決辦法,重新建立軟連接。

rm libopencv_core.so libopencv_core.so.405 ln -s libopencv_core.so.4.5.5 libopencv_core.so.405 ln -s libopencv_core.so.405 libopencv_core.so

? ? ? ? 經過上述的各種問題的處理,終于交叉編譯的程序終于在RK3566的板子上正常運行。

六、交叉編譯譯程序在RK3566上的運行

? ? ? ? 通過Ubuntu18.04交叉編譯的OpenCV庫除了opencv_highgui這個庫之外,其他庫都基本都是正常的。PC的Ubuntu18.04編譯的OpenCV庫會出現下面的問題:

terminate called after throwing an instance of 'cv::Exception'what(): OpenCV(4.5.5-dev) /home/wzw/opencv4.5.5/modules/highgui/src/window.cpp:1251: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-devand pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'

? ? ? ? 這是因為opencv_highgui這個庫依賴GTK圖形庫。而虛擬機的libgtk是x64,RK3566是arm的libgtk。對于這個問題,可以在RK3566通過源碼編譯opencv_highgui.so這個庫,然后替換交叉編譯的opencv_highgui.so。

? ? ? ?我測試了一下RK3566通過源碼的方式安裝OpenCV4.5.5 + OpenCV_Contrib4.5.5 大約需要3小時。如果僅選擇opencv_core和opencv_highgui等基本庫,應該很快就能編譯完。

總結

以上是生活随笔為你收集整理的四、SLAM学习笔记—— Ubuntu18.04交叉编译OpenCV4.5.5至ARM64位平台firefly-RK3566的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。