IMX6ULL 安装opencv库并在开发板测试
本文详细介绍了在IMX6ULL开发板上配置OpenCV的完整流程。首先通过网盘提供了必要的资源文件(PDF教程、OpenCV库和测试代码)。重点讲解了使用cmake-gui工具进行交叉编译的步骤:1)安装cmake-qt-gui工具;2)设置源码路径和构建目录;3)配置交叉编译工具链(包括指定ARM编译器路径和根目录)。
本人是结合了正点原子在这方面的opencv库的配置写的这篇博客,从中也遇到了许多的问题,阐述了解决问题的方式,请结合这篇PDF和这篇博客进行学习,以pdf为主,pdf中解决不了的你可以看看这篇博客。交叉编译一般我们都配置过直接跳过。这篇博客适用任何类型的IMX6ULL,伟东山,正点原子的都行。
通过网盘分享的文件:opencv.zip
链接: https://pan.baidu.com/s/1EID-eZWSXBiI77sRnJwBJA?pwd=sd5z 提取码: sd5z
在这个链接中有PDF,opencv库,后续测试所涉及到的代码。
下载完库之后,打开终端运行cmake-gui。
cmake-gui
刚开始输入命令行的时候发现没有。
安装
# Ubuntu/Debian 系统
sudo apt update
sudo apt install cmake-qt-gui

输入命令行下载,完成后长这样。
第一步:填写基础路径
Where is the source code: (源代码在哪)
点击 “Browse Source…” 按钮,选择你下载的OpenCV源码根目录(包含 CMakeLists.txt 的文件夹,例如 /home/book/tools/opencv)。
Where to build the binaries: (编译输出到哪)
点击 “Browse Build…” 按钮,选择或创建一个空文件夹作为构建目录(例如 /home/book/tools/opencv/build)。建议新建一个,不要与源码混在一起。
第二步:配置编译器(最关键的一步)
点击下方的 Configure 按钮。
此时会弹出新窗口 “Specify the generator for this project”(指定生成器)。
在第一项 “Specify the generator for this project” 下拉菜单中,选择 “Unix Makefiles”(因为你是在Linux主机上为ARM目标编译)。
下面会出现一个非常重要的选项:“Specify options file for cross-compiling”(指定交叉编译的工具链文件)。请务必勾选它!
勾选后,点击 “Next”。

set(CMAKE_C_COMPILER /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf-g++)
# 指定编译器查找头文件和库文件的根目录
set(CMAKE_FIND_ROOT_PATH /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot)

当你出现类似于以上这种问题时。
[ 65%] Linking CXX executable ../../bin/opencv_test_imgproc
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/ml/CMakeFiles/opencv_test_ml.dir/build.make:309: recipe for target 'bin/opencv_test_ml' failed
make[2]: *** [bin/opencv_test_ml] Error 1
CMakeFiles/Makefile2:2061: recipe for target 'modules/ml/CMakeFiles/opencv_test_ml.dir/all' failed
make[1]: *** [modules/ml/CMakeFiles/opencv_test_ml.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/flann/CMakeFiles/opencv_test_flann.dir/build.make:127: recipe for target 'bin/opencv_test_flann' failed
make[2]: *** [bin/opencv_test_flann] Error 1
CMakeFiles/Makefile2:1805: recipe for target 'modules/flann/CMakeFiles/opencv_test_flann.dir/all' failed
make[1]: *** [modules/flann/CMakeFiles/opencv_test_flann.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/photo/CMakeFiles/opencv_test_photo.dir/build.make:335: recipe for target 'bin/opencv_test_photo' failed
make[2]: *** [bin/opencv_test_photo] Error 1
CMakeFiles/Makefile2:2309: recipe for target 'modules/photo/CMakeFiles/opencv_test_photo.dir/all' failed
make[1]: *** [modules/photo/CMakeFiles/opencv_test_photo.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/dnn/CMakeFiles/opencv_perf_dnn.dir/build.make:205: recipe for target 'bin/opencv_perf_dnn' failed
make[2]: *** [bin/opencv_perf_dnn] Error 1
CMakeFiles/Makefile2:2640: recipe for target 'modules/dnn/CMakeFiles/opencv_perf_dnn.dir/all' failed
make[1]: *** [modules/dnn/CMakeFiles/opencv_perf_dnn.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/objdetect/CMakeFiles/opencv_perf_objdetect.dir/build.make:153: recipe for target 'bin/opencv_perf_objdetect' failed
make[2]: *** [bin/opencv_perf_objdetect] Error 1
CMakeFiles/Makefile2:2244: recipe for target 'modules/objdetect/CMakeFiles/opencv_perf_objdetect.dir/all' failed
make[1]: *** [modules/objdetect/CMakeFiles/opencv_perf_objdetect.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/objdetect/CMakeFiles/opencv_test_objdetect.dir/build.make:153: recipe for target 'bin/opencv_test_objdetect' failed
make[2]: *** [bin/opencv_test_objdetect] Error 1
CMakeFiles/Makefile2:2163: recipe for target 'modules/objdetect/CMakeFiles/opencv_test_objdetect.dir/all' failed
make[1]: *** [modules/objdetect/CMakeFiles/opencv_test_objdetect.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/photo/CMakeFiles/opencv_perf_photo.dir/build.make:179: recipe for target 'bin/opencv_perf_photo' failed
make[2]: *** [bin/opencv_perf_photo] Error 1
CMakeFiles/Makefile2:2390: recipe for target 'modules/photo/CMakeFiles/opencv_perf_photo.dir/all' failed
make[1]: *** [modules/photo/CMakeFiles/opencv_perf_photo.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/video/CMakeFiles/opencv_perf_video.dir/build.make:387: recipe for target 'bin/opencv_perf_video' failed
make[2]: *** [bin/opencv_perf_video] Error 1
CMakeFiles/Makefile2:2493: recipe for target 'modules/video/CMakeFiles/opencv_perf_video.dir/all' failed
make[1]: *** [modules/video/CMakeFiles/opencv_perf_video.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/video/CMakeFiles/opencv_test_video.dir/build.make:387: recipe for target 'bin/opencv_test_video' failed
make[2]: *** [bin/opencv_test_video] Error 1
CMakeFiles/Makefile2:2536: recipe for target 'modules/video/CMakeFiles/opencv_test_video.dir/all' failed
make[1]: *** [modules/video/CMakeFiles/opencv_test_video.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/imgproc/CMakeFiles/opencv_perf_imgproc.dir/build.make:1062: recipe for target 'bin/opencv_perf_imgproc' failed
make[2]: *** [bin/opencv_perf_imgproc] Error 1
CMakeFiles/Makefile2:1869: recipe for target 'modules/imgproc/CMakeFiles/opencv_perf_imgproc.dir/all' failed
make[1]: *** [modules/imgproc/CMakeFiles/opencv_perf_imgproc.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/core/CMakeFiles/opencv_perf_core.dir/build.make:880: recipe for target 'bin/opencv_perf_core' failed
make[2]: *** [bin/opencv_perf_core] Error 1
CMakeFiles/Makefile2:1668: recipe for target 'modules/core/CMakeFiles/opencv_perf_core.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/core/CMakeFiles/opencv_test_core.dir/build.make:880: recipe for target 'bin/opencv_test_core' failed
make[2]: *** [bin/opencv_test_core] Error 1
CMakeFiles/Makefile2:1626: recipe for target 'modules/core/CMakeFiles/opencv_test_core.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
modules/imgproc/CMakeFiles/opencv_test_imgproc.dir/build.make:1400: recipe for target 'bin/opencv_test_imgproc' failed
make[2]: *** [bin/opencv_test_imgproc] Error 1
CMakeFiles/Makefile2:1911: recipe for target 'modules/imgproc/CMakeFiles/opencv_test_imgproc.dir/all' failed
make[1]: *** [modules/imgproc/CMakeFiles/opencv_test_imgproc.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2
这个问题仍然是PNG库NEON支持缺失导致的,但这次错误发生在OpenCV的应用程序(apps)模块上。您需要禁用这些应用程序的编译。
🎯 解决方案
方案:禁用所有应用程序(最快)
在CMakeSetup中添加以下选项:
禁用OpenCV应用程序:
Name: BUILD_opencv_apps
Type: BOOL
Value: 取消勾选(设为OFF)
确保之前设置已应用:
BUILD_TESTS=OFF
BUILD_PERF_TESTS=OFF
WITH_PNG=OFF
在CMakeSetup中添加
- BUILD_opencv_annotation=OFF
- BUILD_opencv_visualisation=OFF
- BUILD_opencv_version=OFF
当你出现类似于以上这种问题时。
[ 87%] Built target opencv_ts
[ 91%] Built target opencv_features2d
[ 91%] Linking CXX executable ../../bin/opencv_version
[ 94%] Built target opencv_calib3d
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
apps/annotation/CMakeFiles/opencv_annotation.dir/build.make:99: recipe for target 'bin/opencv_annotation' failed
make[2]: *** [bin/opencv_annotation] Error 1
CMakeFiles/Makefile2:2869: recipe for target 'apps/annotation/CMakeFiles/opencv_annotation.dir/all' failed
apps/visualisation/CMakeFiles/opencv_visualisation.dir/build.make:99: recipe for target 'bin/opencv_visualisation' failed
make[2]: *** [bin/opencv_visualisation] Error 1
make[1]: *** [apps/annotation/CMakeFiles/opencv_annotation.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
CMakeFiles/Makefile2:2928: recipe for target 'apps/visualisation/CMakeFiles/opencv_visualisation.dir/all' failed
make[1]: *** [apps/visualisation/CMakeFiles/opencv_visualisation.dir/all] Error 2
[ 96%] Built target opencv_stitching
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/bin/ld: ../../lib/libopencv_imgcodecs.so.3.4.1: undefined reference to `png_init_filter_functions_neon'
collect2: error: ld returned 1 exit status
apps/version/CMakeFiles/opencv_version.dir/build.make:99: recipe for target 'bin/opencv_version' failed
make[2]: *** [bin/opencv_version] Error 1
CMakeFiles/Makefile2:3049: recipe for target 'apps/version/CMakeFiles/opencv_version.dir/all' failed
make[1]: *** [apps/version/CMakeFiles/opencv_version.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2
具体操作步骤
步骤1:在CMakeSetup中添加选项
点击 "Add Entry" 按钮添加:
禁用应用程序:
Name: BUILD_opencv_apps
Type: BOOL
Value: 取消勾选(设为OFF)
确认其他禁用选项:
确保 BUILD_TESTS=OFF
确保 BUILD_PERF_TESTS=OFF
确保 WITH_PNG=OFF
步骤2:重新配置和编译
cd /home/book/tools/opencv/build
重新配置
在CMakeSetup中点击Configure -> Generate
重新编译
make -j4
🔍 问题分析
从错误信息看,失败的应用程序包括:
opencv_annotation- 图像标注工具
opencv_visualisation- 可视化工具
opencv_version- 版本查看工具
这些工具都链接到了libopencv_imgcodecs.so,而该库需要PNG支持。
💡 为什么禁用应用程序能解决问题?
应用程序不是核心库:这些是可选的命令行工具
核心功能已编译成功:从输出看,主要库(opencv_calib3d、opencv_stitching等)都已成功编译
不影响OpenCV使用:禁用应用程序不影响您在代码中使用OpenCV库
找到以上所述的地方取消勾选,如下图所示。
您禁用了bin文件的生成
BUILD_opencv_apps=OFF # 禁用命令行工具
BUILD_TESTS=OFF # 禁用测试程序
BUILD_PERF_TESTS=OFF # 禁用性能测试工具

编译完成后会出现install中有

测试看文件是否生成的是32位。
book@100ask:~/tools/opencv/install/lib$ file /home/book/tools/opencv/install/lib/libopencv_calib3d.so.3.4.1

可以看到是32位。
在qt里面测试导入头文件也通过了,注意你的pro文件得改加入头文件地址。
接下来就是IMX6ULL
准备将编译好的文件上传给开发板。本人的思路是新建了一个根目录地址,使opencv生成的一系列库so文件不会影响覆盖我以前的文件。
首先新建一个文件路径。
[root@100ask:/]# mkdir -p opencv_lib
然后再将文件上传给指定路径地址。
book@100ask:~/tools/opencv/install/lib$ adb push /home/book/tools/opencv/install/lib/* /opencv_lib

输入此命令行设置其根目录路径。
vi /etc/profile

永久设置(添加到启动脚本)
export LD_LIBRARY_PATH=/opencv_lib:$LD_LIBRARY_PATH

:wq 保存并退出
这样配置后,/opencv_lib就成为了系统的库搜索路径,您的应用程序就可以正常找到和链接OpenCV库了。
配置都完成了,那是不是得在板子上面测试一下最好。
首先pro文件指定头文件地址。
使用我的测试代码发现,导入多个头文件没有问题,代码在上述链接中。
实验效果视频
更多推荐
所有评论(0)