Linux交叉編譯opencv并移植ARM端 - 知乎
一、安裝交叉編譯器
目標平臺為arm7l,此為32位ARM架構,要安裝合適的編譯器
sudo apt install arm-linux-gnueabihf-gcc
sudo apt install arm-linux-gnueabihf-g++
注意:64位ARM架構的編譯器與32位ARM架構的編譯器不能通用
二、opencv交叉編譯
opencv的交叉編譯工具鏈在../opencv3.2.0/platforms/linux 路徑下,linux文件夾下是一些.cmake文件,對應不同的移植對象,我需要在rv1126上部署模型,所以選擇platform/linux/arm-gnueabi.toolchain.cmake
你也可以對其作出修改(添加編譯器所在位置):
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
set(GNU_MACHINE "arm-linux-gnueabi" CACHE STRING "GNU compiler triple")set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++)include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")
接下來執行交叉編譯命令
mkdir build && cd build
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/mnt/usr/local -D OPENCV_EXTRA_MODULES_PATH=/opt/opencv/opencv_contrib/modules/ -D OPENCV_ENABLE_NONFREE=True -DCMAKE_TOOLCHAIN_FILE=/opt/opencv/platforms/linux/arm-gnueabi.toolchain.cmake ..sudo make -j8
sudo make install

編譯結束后進入 build 文件夾,里面生成bin,include,lib,share四個文件夾
三、Linux上生成ARM架構下可執行文件
創建測試用例test.cpp,內容如下
#include <opencv2/opencv.hpp>using namespace cv; int main( int argc, char** argv )
{ Mat image; image = imread( "7.bmp", 1 ); if( !image.data ) { printf( "No image data \n" ); return -1; } cv::Point lu = cv::Point(180, 60); cv::Point rd = cv::Point(400, 260); cv::rectangle(image, lu, rd, cv::Scalar( 255, 20, 0 ), 1, cv::LINE_AA ); imwrite("8.bmp", image); return 0;
}
CMakeList.txt
cmake_minimum_required(VERSION 2.8.4)project(draw_image)
include ($ENV{HOME}/configs/cross.cmake)find_package(OpenCV REQUIRED)
add_executable(${CMAKE_PROJECT_NAME} test.cpp)
target_include_directories(draw_image PUBLIC ${OpenCV_INCLUDE_DIRS})
target_link_libraries(draw_image PRIVATE ${OpenCV_LIBS})
~
在終端執行:
?
mkdir build && cd buid
cmake ..
make
在test.cpp同一目錄下會生成可執行文件 draw_image,利用file draw_image檢查可執行文件格式是否支持arm
draw_image: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=6030f6191b409626a1f54c996cebb91aad644061, for GNU/Linux 3.2.0, not stripped
出現如上結果說明可執行文件支持ARM7l
四、移植ARM端執行
將 build文件夾里面的include和lib里的文件分別拷貝到ARM板的/usr/include 和/usr/lib下 然后打開終端執行可執行文件即可。
build文件里include也許是空的,你可以在安裝目錄/include/找到opencv的頭文件
draw_image可以執行