在Ubuntu中交叉编译Opencv 4.5.1 运行于Tina Linux中(整合帖)
-
前言
看到很多人在小哪吒上编译Opencv,自己也尝试过编译了几次,各位开发者在编译的时候都可能会遇到不同的问题,现将其整理出来方便后面新来的开发者查阅。
环境需求
理论上任何版本的Ubuntu都可以,在社区中有hu487364在Ubuntu14 中成功 见帖:编译Tengine D1 出错
aldfaaa的Ubuntu20.04中,见贴:Ubuntu20.04交叉编译OpenCV 4.5.2, 运行在Tina Linux- hu487364 在虚拟机中,符合广大开发者开发环境及方法。
- aldfaaa使用命令行和直接修改CmakeLists.txt 文件来完成编译.
这里推荐开发者使用第一种方法。在虚拟机中使用cmake-gui进行配置完成编译。
工具安装
sudo apt install cmake-qt-gui
获取opencv源码
(小声bb)opencv的Relase版本更新还是挺快的,当然推荐大家使用最新的版本,这里就先贴上上一个版本了(前两天还是最新版本)
源码下载地址下载源码后,放到虚拟机目录进行解压。然后进入opencv目录。
编译及编译配置
编译使用
cmake-gui
打开cmake配置工具。
source 选择 opencv源码路径 build 选择编译路径(!注意不是安装路径)
然后点击
此处务必选择SDK中交叉编译链路径
# Operating system : Linux # process : riscv # C 选择 d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gcc # C++ 选择 d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gc++ # Target root 选择 d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702
然后点击 FInish
编译配置
打开Advancd选项, 设置了这些选项:
CMAKE_BUILD_TYPE Release CMAKE_EXE_LINKER_FLAGS -ldl -lpthread -latomic CMAKE_INSTALL_PREFIX ./install 关闭jpeg 和 openjpeg 选项。 搜索python 和 java --> 关闭所有相关的选项 关于 是否勾选 opencv_word 将其全部链接成一个静态库 此处就仁者见仁智者见智。。。看个人需求 我自己是勾上的 这样在链接的时候好链接
文件更改
(1)
/d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/sysroot/usr/include/features.h
的第364
行前 加 上#define _FILE_OFFSET_BITS 64
(2)opencv/3rdparty/protobuf/src/google/protobuf/stubs/commen.cc
中增加一行#define HAVE_PTHREAD
确认都配置好后
点击Configure ---> Configuring done
点击Generate----->Generating done
如果两个都没有问题,此时就可以开始编译了编译
make -j8
这个错误是因为没有关上jpeg 暂时只能将这个包关掉做编译(类型错误,没有修正)
这个错误是没有在上面加 -latomic
如果以上都没有 ,你就可以顺利编译下来
然后你就可以在install
目录下 看到我们交叉编译后的文件了
在移动到板子之前,我们需要将atimic (原子操作库) 移动到我们的lib 目录,因为 Tina 默认没有将原子库打包进固件内。
cd 到lib目录 # -d 和 * 可以保证其全部链接拿出来 cp -d ~/d1-tina-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/riscv64-unknown-linux-gnu/lib64/lp64d/libatomic.so* .
移动完成后 lib 中就有 如下 静态库。
然后就可以使用adb 将其 发送至开发板中。 即将完成!!
adb push lib\libopencv_world.so /lib adb push lib\libatomic.so /lib adb push lib\libatomic.so.1.2.0 /lib adb push lib\libatomic.so.1 /lib
然后我们再将 bin 送入开发板
adb push bin /root
root@TinaLinux:~/bin# chmod +x * root@TinaLinux:~/bin# ls opencv_annotation opencv_visualisation opencv_interactive-calibration setup_vars_opencv4.sh opencv_version root@TinaLinux:~/bin# ./opencv_version 4.5.1
可以看到我们的开发板已经打印了 opencv的版本号 即将起飞。芜湖
注意
我们在编译的过程中 关掉了 jpeg 的相关包,所以在 imwrite 等操作时 ,无法解析 jpg 文件会出现这样的报错:
terminate called after throwing an instance of 'cv::Exception' what(): OpenCV(4.5.1) /home/jie/下载/opencv-4.5.1/modules/imgcodecs/src/loadsave.cpp:682: error: (-2:Unspecified error) could not find a writer for the specified extension in function 'imwrite_'
-
请问你遇到过这种问题吗,百度无解,一开始勾选上BUILD_opencv_world的时候也有这种问题,但是不知道咋办,然后我就取消勾选了,但在另一个地方还是出现了这种问题。 -
@lijyhh 在 在Ubuntu中交叉编译Opencv 4.5.1 运行于Tina Linux中(整合帖) 中说:
请问你遇到过这种问题吗,百度无解,一开始勾选上BUILD_opencv_world的时候也有这种问题,但是不知道咋办,然后我就取消勾选了,但在另一个地方还是出现了这种问题。看错误是没有找到 lib64xthead/lp64d/livc.so.6 在交叉编译工具链中 的 lib/ld-linux-riscv64xthead-lp64d.so.1 中链接不到 你检查一下你的交叉编译链 路径中对应的位置 是不是存在这个文件 如果存在 就是在 刚开始设置的过程中 编译链根目录设置错误
不是勾选 BUILD_opencv_world 的问题 -
@lijyhh 建议用Tina工具链编译东西前, 按照编译Tina SDK的方法, 先加载编译环境:
-
@lijyhh
在Tina SDK目录下运行这些脚本source build/envsetup.sh lunch d1_nezha-tina
这样环境变量一般是可以了, 因为连系统都能编译出来, 何况是个库呢
-
@lijyhh 对的,我也推荐使用Tina中的交叉编译链,之前下载的最新的交叉编译链,不能在Tina中运行,会报LIBC版本不对
-
-fpermissive这是错误是可以忽略的.
在CMakeLists.txt加一句add_compile_options(-fpermissive) 或 set(CMAKE_CXX_FLAGS "-fpermissive ${CMAKE_CXX_FLAGS}")
即可将错误转为警告
-
两位大佬,看了你们的回答,我仔细检查了一下cmake配置,发现是编译器路径设置错了,改了之后不会出现上面的错误了,谢谢两位!!!
但是现在又遇到了新的问题:
这是为啥呀,还得麻烦二位帮忙看一下 -
@lijyhh 你开单线程编译 或者你之前在配置的过程中有东西没有下载 看一下cmake 有没有错误
-
感谢大佬提供的教程,我在自己的板子上也安装成功了,遇到了一些问题,贴出来:
一.大佬文中有几处笔误,都是小问题:
1.原文“关于 是否勾选 opencv_word 将其全部链接成一个静态库 此处就仁者见仁智者见智。。。看个人需求”里面的opencv_word应该为opencv_world。
2.原文“opencv/3rdparty/protobuf/src/google/protobuf/stubs/commen.cc 中增加一行”里面的commen应该为common
二.我遇到的一些问题
1.”file RELATIVE_PATH must be passed a full path to the directory : ./install/lib。“此处提示使用绝对路径而非相对路径,需要将
此处的./install改为绝对路径,比如我这里是/usr/opencv/build/install。
2.“/opencv-4.5.2/nodules/videoio/src/cap_dc1394_v2.cpp:59:10: fatal error: dc1394/dc1394.h: No such file or directory
. #include <dc1394/dc1394.h>”这里参考文章:fatal error: dc1394/dc1394.h: No such file or directory的问题原因?,只需搜索 WITH_DC1394,去掉该选项即可。
3.
在Tina SDK目录下运行这些脚本source build/envsetup.sh
lunch d1_nezha-tina这样环境变量一般是可以了, 因为连系统都能编译出来, 何况是个库呢。
如果不行就检查交叉编译工具链是否设置正确,我的这个错误是由于g++编译器设置错误了导致的。
实在不行就重新弄一遍cmake,记得删除上次的CmakeCache.txt
4.安装好opencv后,将文件push到板子上进行测试,报错:
应该是由于opencv_world库的名字不对,将libopencv_world.so改为libopencv_world.so.4.5即可 -
请问你的opencv能读取图片吗,我的报这个错误:
这个cmake的时候勾选了jpeg选项 -
@lijyhh 我不能读取jpg 图片,我读取的时候是不报错的,但是会读不到,png 可以读
-
@lijyhh 请问一下你jpeg的错误是怎么解决的
-
@bedrock 没有解决
-
ncnn 自带的 simpleocv 支持读写 jpg png bmp 等图片格式,用法和 opencv 一样
-
@nihui 妙不可言
直接ncnn
ncnn Mat 和 Opencv Mat 是不是有着异曲同工的意思 -
@bedrock simpleocv.h 里面是对着opencv api模拟的,大部分opencv的代码不需要改就能兼容啦
-
@nihui cool,就是选择性集成
-
@nihui 要是能写个remap就好了
-
@aldfaaa OpenCV的remap成功跑起来了
-
This post is deleted! -
按照这个帖子编译的 ,不知道怎么处理,还是cmake 选项的问题 -
勾选 BUILD_opencv_world 报这个错,
-
这里提示一下,那个原子库,注意lp64d别搞成lp64了。
-
-
-
@aldfaaa 库编译可以用tina的交叉环境编译,但是现在的OPENCV的CPP程序需要引用OPENCV的库,交叉编译又找不到编译出来的库,不知道APP这方面,如何交叉编译的时候还能用上自己编译出来的LIB库阿?
-
@astonzorro 最简单的方法: 交叉编译链的 -l 链接动态库 -i 包含头文件路径 参数来设置
高级方法:包管理
工具方法:cmake(教程很多)
Copyright © 2023 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号