一、环境介绍
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
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就执行下的命令安装。
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源码
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文件夹用于存放编译之后的文件
wbyq@wbyq:~/work/opencv-3.4.9$ mkdir _install
wbyq@wbyq:~/work/opencv-3.4.9$ cmake-gui
选择OpenCV源码文件夹和存放编译文件的文件夹。
下一步之后选择编译器配置。
完成点击Finish,接下来cmake就会加载配置。
完成步骤之后,关闭图像配置界面,进入到源码安装目录下,看是否生成了Makefile文件。
接下来就进行编译安装了。
byq:~/work/opencv-3.4.9/_install$ make && make install
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相关的库和头文件。
具体看下面代码:
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库的路径)
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
下面公众号有全套基础QT\C\C++\单片机教程。