OpenCV开发:ubuntu18.04下交叉编译OpenCV3.4.9到ARM64位平台RK3399(aarch64-linux-)

2022-01-12 10:59:27 浏览数 (1)

一、环境介绍

ubuntu版本: VM虚拟机运行ubuntu18.04 64位

OpenCV版本: 3.4.9

目标开发板: RK3399

二、相关源码包下载地址

OpenCV源码下载地址: https://opencv.org/releases/

选择3.4.9版本下载。

aarch64-linux-交叉编译器下载地址: https://download.csdn.net/download/xiaolong1126626497/12203205

三、编译OpenCV源码

3.1 安装cmake

代码语言:javascript复制
wbyq@wbyq:~/work$ cmake-gui

Command 'cmake-gui' not found, but can be installed with:

sudo snap install cmake         # version 3.16.5, or
sudo apt  install cmake-qt-gui

See 'snap info cmake' for additional versions.

wbyq@wbyq:~/work$ 

没有cmake就执行下的命令安装。

代码语言:javascript复制
wbyq@wbyq:~/work/opencv-3.4.9/_install$ sudo apt-get install cmake
wbyq@wbyq:~/work/opencv-3.4.9/_install$ sudo apt  install cmake-qt-gui
wbyq@wbyq:~/work/opencv-3.4.9/_install$ sudo apt-get install libgtk2.0-dev
wbyq@wbyq:~/work/opencv-3.4.9/_install$ sudo apt-get install pkg-config

3.2 解压OpenCV源码

代码语言:javascript复制
wbyq@wbyq:~/work$ unzip /mnt/hgfs/linux-share-dir/opencv-3.4.9.zip 
wbyq@wbyq:~/work$ ls
arm-linux-gcc  opencv-3.4.9  rk3399
wbyq@wbyq:~/work$ cd opencv-3.4.9/
wbyq@wbyq:~/work/opencv-3.4.9$ ls
3rdparty  apps  cmake  CMakeLists.txt  CONTRIBUTING.md  data  doc  include  LICENSE  modules  platforms  README.md  samples

3.3 配置cmake编译opencv

在源码目录下创建一个_install文件夹用于存放编译之后的文件

代码语言:javascript复制
wbyq@wbyq:~/work/opencv-3.4.9$ mkdir _install
wbyq@wbyq:~/work/opencv-3.4.9$ cmake-gui

选择OpenCV源码文件夹和存放编译文件的文件夹。

下一步之后选择编译器配置。

完成点击Finish,接下来cmake就会加载配置。

完成步骤之后,关闭图像配置界面,进入到源码安装目录下,看是否生成了Makefile文件。

接下来就进行编译安装了。

代码语言:javascript复制
byq:~/work/opencv-3.4.9/_install$ make && make install

编译完成:

代码语言:javascript复制
wbyq@wbyq:~/work/opencv-3.4.9/_install$ 
wbyq@wbyq:~/work/opencv-3.4.9/_install$ cd install/
wbyq@wbyq:~/work/opencv-3.4.9/_install/install$ ls
bin  include  lib  share
wbyq@wbyq:~/work/opencv-3.4.9/_install/install$ tree
.
├── bin
│   ├── opencv_annotation
│   ├── opencv_createsamples
│   ├── opencv_interactive-calibration
│   ├── opencv_traincascade
│   ├── opencv_version
│   ├── opencv_visualisation
│   └── setup_vars_opencv3.sh
├── include
│   ├── opencv
│   │   ├── cvaux.h
│   │   ├── cvaux.hpp
│   │   ├── cv.h
│   │   ├── cv.hpp
│   │   ├── cvwimage.h
│   │   ├── cxcore.h
│   │   ├── cxcore.hpp
│   │   ├── cxeigen.hpp
│   │   ├── cxmisc.h
│   │   ├── highgui.h
│   │   └── ml.h
│   └── opencv2
│       ├── calib3d
│       │   ├── calib3d_c.h
│       │   └── calib3d.hpp
│       ├── calib3d.hpp
│       ├── core
│       │   ├── affine.hpp
│       │   ├── async.hpp
│       │   ├── base.hpp
│       │   ├── bindings_utils.hpp
│       │   ├── bufferpool.hpp
│       │   ├── check.hpp
│       │   ├── core_c.h
│       │   ├── core.hpp
│       │   ├── cuda
│       │   │   ├── block.hpp
│       │   │   ├── border_interpolate.hpp
│       │   │   ├── color.hpp
│       │   │   ├── common.hpp
│       │   │   ├── datamov_utils.hpp
│       │   │   ├── detail
│       │   │   │   ├── color_detail.hpp
│       │   │   │   ├── reduce.hpp
│       │   │   │   ├── reduce_key_val.hpp
│       │   │   │   ├── transform_detail.hpp
│       │   │   │   ├── type_traits_detail.hpp
│       │   │   │   └── vec_distance_detail.hpp
│       │   │   ├── dynamic_smem.hpp
│       │   │   ├── emulation.hpp
│       │   │   ├── filters.hpp
│       │   │   ├── funcattrib.hpp
│       │   │   ├── functional.hpp
│       │   │   ├── limits.hpp
│       │   │   ├── reduce.hpp
│       │   │   ├── saturate_cast.hpp
│       │   │   ├── scan.hpp
│       │   │   ├── simd_functions.hpp
│       │   │   ├── transform.hpp
│       │   │   ├── type_traits.hpp
│       │   │   ├── utility.hpp
│       │   │   ├── vec_distance.hpp
│       │   │   ├── vec_math.hpp
│       │   │   ├── vec_traits.hpp
│       │   │   ├── warp.hpp
│       │   │   ├── warp_reduce.hpp
│       │   │   └── warp_shuffle.hpp
│       │   ├── cuda.hpp
│       │   ├── cuda.inl.hpp
│       │   ├── cuda_stream_accessor.hpp
│       │   ├── cuda_types.hpp
│       │   ├── cv_cpu_dispatch.h
│       │   ├── cv_cpu_helper.h
│       │   ├── cvdef.h
│       │   ├── cvstd.hpp
│       │   ├── cvstd.inl.hpp
│       │   ├── detail
│       │   │   ├── async_promise.hpp
│       │   │   └── exception_ptr.hpp
│       │   ├── directx.hpp
│       │   ├── eigen.hpp
│       │   ├── fast_math.hpp
│       │   ├── hal
│       │   │   ├── hal.hpp
│       │   │   ├── interface.h
│       │   │   ├── intrin_avx512.hpp
│       │   │   ├── intrin_avx.hpp
│       │   │   ├── intrin_cpp.hpp
│       │   │   ├── intrin_forward.hpp
│       │   │   ├── intrin.hpp
│       │   │   ├── intrin_msa.hpp
│       │   │   ├── intrin_neon.hpp
│       │   │   ├── intrin_sse_em.hpp
│       │   │   ├── intrin_sse.hpp
│       │   │   ├── intrin_vsx.hpp
│       │   │   ├── intrin_wasm.hpp
│       │   │   ├── msa_macros.h
│       │   │   └── simd_utils.impl.hpp
│       │   ├── ippasync.hpp
│       │   ├── mat.hpp
│       │   ├── mat.inl.hpp
│       │   ├── matx.hpp
│       │   ├── neon_utils.hpp
│       │   ├── ocl_genbase.hpp
│       │   ├── ocl.hpp
│       │   ├── opencl
│       │   │   ├── ocl_defs.hpp
│       │   │   ├── opencl_info.hpp
│       │   │   ├── opencl_svm.hpp
│       │   │   └── runtime
│       │   │       ├── autogenerated
│       │   │       │   ├── opencl_clamdblas.hpp
│       │   │       │   ├── opencl_clamdfft.hpp
│       │   │       │   ├── opencl_core.hpp
│       │   │       │   ├── opencl_core_wrappers.hpp
│       │   │       │   ├── opencl_gl.hpp
│       │   │       │   └── opencl_gl_wrappers.hpp
│       │   │       ├── opencl_clamdblas.hpp
│       │   │       ├── opencl_clamdfft.hpp
│       │   │       ├── opencl_core.hpp
│       │   │       ├── opencl_core_wrappers.hpp
│       │   │       ├── opencl_gl.hpp
│       │   │       ├── opencl_gl_wrappers.hpp
│       │   │       ├── opencl_svm_20.hpp
│       │   │       ├── opencl_svm_definitions.hpp
│       │   │       └── opencl_svm_hsa_extension.hpp
│       │   ├── opengl.hpp
│       │   ├── operations.hpp
│       │   ├── optim.hpp
│       │   ├── ovx.hpp
│       │   ├── persistence.hpp
│       │   ├── ptr.inl.hpp
│       │   ├── saturate.hpp
│       │   ├── simd_intrinsics.hpp
│       │   ├── softfloat.hpp
│       │   ├── sse_utils.hpp
│       │   ├── traits.hpp
│       │   ├── types_c.h
│       │   ├── types.hpp
│       │   ├── utility.hpp
│       │   ├── utils
│       │   │   ├── allocator_stats.hpp
│       │   │   ├── allocator_stats.impl.hpp
│       │   │   ├── filesystem.hpp
│       │   │   ├── instrumentation.hpp
│       │   │   ├── logger.defines.hpp
│       │   │   ├── logger.hpp
│       │   │   ├── tls.hpp
│       │   │   └── trace.hpp
│       │   ├── va_intel.hpp
│       │   ├── version.hpp
│       │   ├── vsx_utils.hpp
│       │   └── wimage.hpp
│       ├── core.hpp
│       ├── cvconfig.h
│       ├── dnn
│       │   ├── all_layers.hpp
│       │   ├── dict.hpp
│       │   ├── dnn.hpp
│       │   ├── dnn.inl.hpp
│       │   ├── layer.details.hpp
│       │   ├── layer.hpp
│       │   ├── shape_utils.hpp
│       │   └── utils
│       │       └── inference_engine.hpp
│       ├── dnn.hpp
│       ├── features2d
│       │   ├── features2d.hpp
│       │   └── hal
│       │       └── interface.h
│       ├── features2d.hpp
│       ├── flann
│       │   ├── all_indices.h
│       │   ├── allocator.h
│       │   ├── any.h
│       │   ├── autotuned_index.h
│       │   ├── composite_index.h
│       │   ├── config.h
│       │   ├── defines.h
│       │   ├── dist.h
│       │   ├── dummy.h
│       │   ├── dynamic_bitset.h
│       │   ├── flann_base.hpp
│       │   ├── flann.hpp
│       │   ├── general.h
│       │   ├── ground_truth.h
│       │   ├── hdf5.h
│       │   ├── heap.h
│       │   ├── hierarchical_clustering_index.h
│       │   ├── index_testing.h
│       │   ├── kdtree_index.h
│       │   ├── kdtree_single_index.h
│       │   ├── kmeans_index.h
│       │   ├── linear_index.h
│       │   ├── logger.h
│       │   ├── lsh_index.h
│       │   ├── lsh_table.h
│       │   ├── matrix.h
│       │   ├── miniflann.hpp
│       │   ├── nn_index.h
│       │   ├── object_factory.h
│       │   ├── params.h
│       │   ├── random.h
│       │   ├── result_set.h
│       │   ├── sampling.h
│       │   ├── saving.h
│       │   ├── simplex_downhill.h
│       │   └── timer.h
│       ├── flann.hpp
│       ├── highgui
│       │   ├── highgui_c.h
│       │   └── highgui.hpp
│       ├── highgui.hpp
│       ├── imgcodecs
│       │   ├── imgcodecs_c.h
│       │   ├── imgcodecs.hpp
│       │   └── ios.h
│       ├── imgcodecs.hpp
│       ├── imgproc
│       │   ├── detail
│       │   │   └── distortion_model.hpp
│       │   ├── hal
│       │   │   ├── hal.hpp
│       │   │   └── interface.h
│       │   ├── imgproc_c.h
│       │   ├── imgproc.hpp
│       │   └── types_c.h
│       ├── imgproc.hpp
│       ├── ml
│       │   ├── ml.hpp
│       │   └── ml.inl.hpp
│       ├── ml.hpp
│       ├── objdetect
│       │   ├── detection_based_tracker.hpp
│       │   ├── objdetect_c.h
│       │   └── objdetect.hpp
│       ├── objdetect.hpp
│       ├── opencv.hpp
│       ├── opencv_modules.hpp
│       ├── photo
│       │   ├── cuda.hpp
│       │   ├── photo_c.h
│       │   └── photo.hpp
│       ├── photo.hpp
│       ├── shape
│       │   ├── emdL1.hpp
│       │   ├── hist_cost.hpp
│       │   ├── shape_distance.hpp
│       │   ├── shape.hpp
│       │   └── shape_transformer.hpp
│       ├── shape.hpp
│       ├── stitching
│       │   ├── detail
│       │   │   ├── autocalib.hpp
│       │   │   ├── blenders.hpp
│       │   │   ├── camera.hpp
│       │   │   ├── exposure_compensate.hpp
│       │   │   ├── matchers.hpp
│       │   │   ├── motion_estimators.hpp
│       │   │   ├── seam_finders.hpp
│       │   │   ├── timelapsers.hpp
│       │   │   ├── util.hpp
│       │   │   ├── util_inl.hpp
│       │   │   ├── warpers.hpp
│       │   │   └── warpers_inl.hpp
│       │   └── warpers.hpp
│       ├── stitching.hpp
│       ├── superres
│       │   └── optical_flow.hpp
│       ├── superres.hpp
│       ├── video
│       │   ├── background_segm.hpp
│       │   ├── tracking_c.h
│       │   ├── tracking.hpp
│       │   └── video.hpp
│       ├── video.hpp
│       ├── videoio
│       │   ├── cap_ios.h
│       │   ├── registry.hpp
│       │   ├── videoio_c.h
│       │   └── videoio.hpp
│       ├── videoio.hpp
│       ├── videostab
│       │   ├── deblurring.hpp
│       │   ├── fast_marching.hpp
│       │   ├── fast_marching_inl.hpp
│       │   ├── frame_source.hpp
│       │   ├── global_motion.hpp
│       │   ├── inpainting.hpp
│       │   ├── log.hpp
│       │   ├── motion_core.hpp
│       │   ├── motion_stabilizing.hpp
│       │   ├── optical_flow.hpp
│       │   ├── outlier_rejection.hpp
│       │   ├── ring_buffer.hpp
│       │   ├── stabilizer.hpp
│       │   └── wobble_suppression.hpp
│       └── videostab.hpp
├── lib
│   ├── libopencv_calib3d.so -> libopencv_calib3d.so.3.4
│   ├── libopencv_calib3d.so.3.4 -> libopencv_calib3d.so.3.4.9
│   ├── libopencv_calib3d.so.3.4.9
│   ├── libopencv_core.so -> libopencv_core.so.3.4
│   ├── libopencv_core.so.3.4 -> libopencv_core.so.3.4.9
│   ├── libopencv_core.so.3.4.9
│   ├── libopencv_dnn.so -> libopencv_dnn.so.3.4
│   ├── libopencv_dnn.so.3.4 -> libopencv_dnn.so.3.4.9
│   ├── libopencv_dnn.so.3.4.9
│   ├── libopencv_features2d.so -> libopencv_features2d.so.3.4
│   ├── libopencv_features2d.so.3.4 -> libopencv_features2d.so.3.4.9
│   ├── libopencv_features2d.so.3.4.9
│   ├── libopencv_flann.so -> libopencv_flann.so.3.4
│   ├── libopencv_flann.so.3.4 -> libopencv_flann.so.3.4.9
│   ├── libopencv_flann.so.3.4.9
│   ├── libopencv_highgui.so -> libopencv_highgui.so.3.4
│   ├── libopencv_highgui.so.3.4 -> libopencv_highgui.so.3.4.9
│   ├── libopencv_highgui.so.3.4.9
│   ├── libopencv_imgcodecs.so -> libopencv_imgcodecs.so.3.4
│   ├── libopencv_imgcodecs.so.3.4 -> libopencv_imgcodecs.so.3.4.9
│   ├── libopencv_imgcodecs.so.3.4.9
│   ├── libopencv_imgproc.so -> libopencv_imgproc.so.3.4
│   ├── libopencv_imgproc.so.3.4 -> libopencv_imgproc.so.3.4.9
│   ├── libopencv_imgproc.so.3.4.9
│   ├── libopencv_ml.so -> libopencv_ml.so.3.4
│   ├── libopencv_ml.so.3.4 -> libopencv_ml.so.3.4.9
│   ├── libopencv_ml.so.3.4.9
│   ├── libopencv_objdetect.so -> libopencv_objdetect.so.3.4
│   ├── libopencv_objdetect.so.3.4 -> libopencv_objdetect.so.3.4.9
│   ├── libopencv_objdetect.so.3.4.9
│   ├── libopencv_photo.so -> libopencv_photo.so.3.4
│   ├── libopencv_photo.so.3.4 -> libopencv_photo.so.3.4.9
│   ├── libopencv_photo.so.3.4.9
│   ├── libopencv_shape.so -> libopencv_shape.so.3.4
│   ├── libopencv_shape.so.3.4 -> libopencv_shape.so.3.4.9
│   ├── libopencv_shape.so.3.4.9
│   ├── libopencv_stitching.so -> libopencv_stitching.so.3.4
│   ├── libopencv_stitching.so.3.4 -> libopencv_stitching.so.3.4.9
│   ├── libopencv_stitching.so.3.4.9
│   ├── libopencv_superres.so -> libopencv_superres.so.3.4
│   ├── libopencv_superres.so.3.4 -> libopencv_superres.so.3.4.9
│   ├── libopencv_superres.so.3.4.9
│   ├── libopencv_videoio.so -> libopencv_videoio.so.3.4
│   ├── libopencv_videoio.so.3.4 -> libopencv_videoio.so.3.4.9
│   ├── libopencv_videoio.so.3.4.9
│   ├── libopencv_video.so -> libopencv_video.so.3.4
│   ├── libopencv_video.so.3.4 -> libopencv_video.so.3.4.9
│   ├── libopencv_video.so.3.4.9
│   ├── libopencv_videostab.so -> libopencv_videostab.so.3.4
│   ├── libopencv_videostab.so.3.4 -> libopencv_videostab.so.3.4.9
│   ├── libopencv_videostab.so.3.4.9
│   └── pkgconfig
│       └── opencv.pc
└── share
    ├── licenses
    │   └── opencv3
    │       ├── ittnotify-LICENSE.BSD
    │       ├── ittnotify-LICENSE.GPL
    │       ├── jasper-copyright
    │       ├── jasper-LICENSE
    │       ├── jasper-README
    │       ├── libjpeg-turbo-LICENSE.md
    │       ├── libjpeg-turbo-README.ijg
    │       ├── libjpeg-turbo-README.md
    │       ├── libpng-LICENSE
    │       ├── libpng-README
    │       ├── libtiff-COPYRIGHT
    │       ├── opencl-headers-LICENSE.txt
    │       ├── protobuf-LICENSE
    │       ├── protobuf-README.md
    │       ├── quirc-LICENSE
    │       ├── SoftFloat-COPYING.txt
    │       └── zlib-README
    └── OpenCV
        ├── haarcascades
        │   ├── haarcascade_eye_tree_eyeglasses.xml
        │   ├── haarcascade_eye.xml
        │   ├── haarcascade_frontalcatface_extended.xml
        │   ├── haarcascade_frontalcatface.xml
        │   ├── haarcascade_frontalface_alt2.xml
        │   ├── haarcascade_frontalface_alt_tree.xml
        │   ├── haarcascade_frontalface_alt.xml
        │   ├── haarcascade_frontalface_default.xml
        │   ├── haarcascade_fullbody.xml
        │   ├── haarcascade_lefteye_2splits.xml
        │   ├── haarcascade_licence_plate_rus_16stages.xml
        │   ├── haarcascade_lowerbody.xml
        │   ├── haarcascade_profileface.xml
        │   ├── haarcascade_righteye_2splits.xml
        │   ├── haarcascade_russian_plate_number.xml
        │   ├── haarcascade_smile.xml
        │   └── haarcascade_upperbody.xml
        ├── lbpcascades
        │   ├── lbpcascade_frontalcatface.xml
        │   ├── lbpcascade_frontalface_improved.xml
        │   ├── lbpcascade_frontalface.xml
        │   ├── lbpcascade_profileface.xml
        │   └── lbpcascade_silverware.xml
        ├── OpenCVConfig.cmake
        ├── OpenCVConfig-version.cmake
        ├── OpenCVModules.cmake
        ├── OpenCVModules-release.cmake
        ├── valgrind_3rdparty.supp
        └── valgrind.supp

42 directories, 361 files
wbyq@wbyq:~/work/opencv-3.4.9/_install/install$

在这个opencv-3.4.9/samples/cpp/example_cmake目录里官方已经给出了一个example可以拿来测试下,使用编译器编译,编译时加上OpenCV相关的库和头文件。

具体看下面代码:

代码语言:javascript复制
wbyq@wbyq:~/work/opencv-3.4.9/samples/cpp/example_cmake$ 
wbyq@wbyq:~/work/opencv-3.4.9/samples/cpp/example_cmake$ pwd
/home/wbyq/work/opencv-3.4.9/samples/cpp/example_cmake
wbyq@wbyq:~/work/opencv-3.4.9/samples/cpp/example_cmake$ ls
a.out  CMakeCache.txt  CMakeFiles  CMakeLists.txt  example.cpp
wbyq@wbyq:~/work/opencv-3.4.9/samples/cpp/example_cmake$ 
wbyq@wbyq:~/work/opencv-3.4.9/samples/cpp/example_cmake$ aarch64-linux-g   example.cpp -I /home/wbyq/work/opencv-3.4.9/_install/install/include/ -L /home/wbyq/work/opencv-3.4.9/_install/install/lib/ -lopencv_calib3d -lopencv_objdetect -lopencv_core -lopencv_photo -lopencv_dnn -lopencv_shape -lopencv_features2d  -lopencv_stitching -lopencv_flann -lopencv_superres -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs  -lopencv_video -lopencv_imgproc -lopencv_videostab -lopencv_ml
wbyq@wbyq:~/work/opencv-3.4.9/samples/cpp/example_cmake$ ls
a.out  CMakeCache.txt  CMakeFiles  CMakeLists.txt  example.cpp
wbyq@wbyq:~/work/opencv-3.4.9/samples/cpp/example_cmake

接下来就把OpenCV编译出来的install目录,打包拷贝到目标开发板。

为了方便在开发板上使用OpenCV,可以写一个配置文件,比如:opencv_3.4.9.profile

内容如下: (路径自己需要修改成自己的实际路径,注意这个文件是在开发板上运行的,所以路径是开发板上的OpenCV库的路径)

代码语言:javascript复制
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wbyq/work/opencv-3.4.9/_install/install/lib
export PATH=$PATH:/home/wbyq/work/opencv-3.4.9/_install/install/bin

编写好之后,在开发板上执行:source opencv_3.4.9.profile 即可。

如果目标开发板不支持GTK,那么上面的例子代码是无法运行的,在不支持GTK的开发板上可以使用QT配合OpenCV进行图像处理显示。

可以参考这里: https://blog.csdn.net/xiaolong1126626497/article/details/105283343

编译好的库在这里下载:https://download.csdn.net/download/xiaolong1126626497/12296879

0 人点赞