一、环境介绍
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