“其他流程网上都有但是要找到适合自己的且没有报错的有点艰难”
首先做好心理准备,用Cmake进行编译的话,每次流程基本上都是2h左右,所以我选择用网线VNC直连后,挂后台处理。
准备:
1.安装Jetson的jtop监控器
2.准备Cmake-gui可视化安装程序(因为之前用代码的话路径容易写错,尽量避免这种情况发生,你也不想再多编译2h吧)
3.确保/usr/lib/中没有其他版本的openCV影响
find / -name "*opencv*" 2>/dev/null
4.推荐ubuntu18.04 + jetpack4.6+CUDA10.2+OpenCV+4.1.1(开始刷机的时候用的4.1.1然后paddlepaddle的4.7覆盖掉了,然后用4.5.3试了一下发现编译的时候.cpp红线报错太多,所以应该是版本不兼容,然后又换回4.1.1)
可以看到版本号:
* OpenCV: 4.1.1 compiled CUDA: NO
5.如果有自带的openCV版本的是默认没有CUDA加速的,下面给出删除方法:
sudo apt purge libopencv*
sudo apt autoremove
sudo apt update
编译安装OpenCV
安装依赖库:
sudo apt install -y build-essential checkinstall cmake pkg-config yasm git gfortran
sudo apt update
sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt install -y libjpeg8-dev libjasper-dev libpng12-dev libtiff5-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine2-dev libv4l-dev
sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgtk2.0-dev libtbb-dev libatlas-base-dev libfaac-dev libmp3lame-dev libtheora-dev libvorbis-dev libxvidcore-dev libopencore-amrnb-dev libopencore-amrwb-dev x264 v4l-utils
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
这里给出一点建议,对于这三个包libtiff-dev libjasper-dev libdc1394-22-dev,如果直接用复制粘贴的时候,连不上ubuntu的服务器,所以建议分步sudo apt-get。
也可以尝试换源的方法,看个人习惯。
OpenCV4.1.1 和 opencv_contrib 4.1.1 源码
前往 OpenCV 和 opencv_contrib 的 github 仓库下载 Latest release 源码
编译和安装 OpenCV
- 将 opencv-4.1.1.zip 和 opencv_contrib-4.1.1.zip 放在同一文件夹并解压,将解压后的opencv_contrib-4.1.1放在opencv-4.1.1文件中
- 其实也不用刻意去关注路径,这就是cmake-gui的好处
- 执行命令
cd opencv-4.1.1 mkdir build cd build sudo cmake-gui
注意:如果用的是4GB的nano的话,在进行编译之前要swap空间。比TX2内存大的都不用考虑。
- 使用代码:
-
cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DOPENCV_ENABLE_NONFREE=1 \ -DBUILD_opencv_python2=1 \ -DBUILD_opencv_python3=1 \ -DWITH_FFMPEG=1 \ -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \ -DCUDA_ARCH_BIN=6.2 \ -DCUDA_ARCH_PTX=6.2 \ -DWITH_CUDA=1 \ -DENABLE_FAST_MATH=1 \ -DCUDA_FAST_MATH=1 \ -DWITH_CUBLAS=1 \ -DOPENCV_GENERATE_PKGCONFIG=1 \ -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.1.1/modules \ ..
注意:使用代码的时候,必须要满足文件关系树。
- 使用gui:勾选后点击Configure..Generate..
检查gui窗口中的路径和 OPENCV_EXTRA_MODULES_PATH以及是否勾选管道GENERATE:
很多博客都有相似的报错(我总结一下):
1.缺少"boostdesc_bgm.i":报错形式为opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:653:20: fatal error: boostdesc_bgm.i: 没有那个文件或目录#include "boostdesc_bgm.i" ;因此需要下载并解压这个文件并添加到src文件中,
文件应包含下面所有文件:
有的还会出现缺少cuviddec.h文件的问题,可以参考这篇博客:Ubuntu18.04安装Autoware1.14-GPU版(慎用!)_autoware_awsim显卡资源_wweweiweiweiwei的博客-CSDN博客
去网上下载文件:
- boostdesc_bgm.i
- boostdesc_bgm_bi.i
- boostdesc_bgm_hd.i
- boostdesc_lbgm.i
- boostdesc_binboost_064.i
- boostdesc_binboost_128.i
- boostdesc_binboost_256.i
- vgg_generated_120.i
- vgg_generated_64.i
- vgg_generated_80.i
- vgg_generated_48.i
这里贴上几个网盘链接:
(1)链接:百度网盘 请输入提取码
提取码:p50x
(2)链接:百度网盘 请输入提取码
提出码:e1wc
总结一下编译之中的错误解决方法:
1.如果是出现红色划线:大概率是文件缺失和头文件失效,以及.hpp文件在cmake-gui未勾选导致其他文件调用失败,比如说:有一个opencv_python_test的文件,如果你勾选了,但是你缺少依赖库和文件也会出现报停
2.最常见的报错就是:
CMakeFiles/Makefile2:1289: recipe for target xxx' failed
make[1]: *** [xxx] Error 2
Makefile:160: recipe for target 'all' failed
make: *** [all] Error 2
很有可能是你勾选了此opencv版本不兼容的模块,面向报错检查自己是否勾错。
3.OpenCV版本重叠,例子:如果你没删干净OpenCV,你编译了低版本的Opencv是不会覆盖的,
就算你编译成功了,make install安装的时候也会报错。
Make:
(事先调整 CPU 性能模式打开尽量多的核心)
sudo make -j4(四核编译)
sudo make -j6(六核编译)
编译完成后最后一步:
sudo make install
检查:
python3:
python3
import cv2
cv2.__version__
jtop:
如果还有其他问题:可以参考以下博客:
(73条消息) 解决CMake Error: The source directory “../CMAKE_BULID_TYPE=RELEASE“ does not exist._Dr.Guo的博客-CSDN博客https://blog.csdn.net/Guo___Liang/article/details/122268047(73条消息) Jetson OpenCV 安装,支持cuda加速,已解决多个常见问题_jetson安装opencv_Not L的博客-CSDN博客https://blog.csdn.net/weixin_45306341/article/details/127926178
(73条消息) ubuntu 18.04 交叉编译opecv 树莓派4 问题总结_搬砖大学生的博客-CSDN博客https://blog.csdn.net/liyangbinbin/article/details/108214116
linux安装opencv时make出错-CSDN社区https://bbs.csdn.net/topics/392374809
2023年11月:(续)重刷系统后重新配置
玩嵌入式多的就是时间,用浪费时间来彰显奢侈!
因为作者之前的系统因为内核更新版本不兼容导致崩溃,然后对原来的系统没有备份。所以打算重新刷包,仍然还是以Jetpack4.6版本为主,这次的CUDA_opencv4.1.1不兼容4.6.4,为了解决使用方面的问题,我们还是将Nvidia官方的opencv4.1.1清除,更新opencv版本为4.8.0(采取这个版本的原因:因为我之前关注的一个外国博主jetsonhack不久才出了最新的配置视频,我为了节约时间按照他的配置来,这样就不用一个个的去添加编译库和依赖了)。博主参考视频链接为Youtube
先从他的github clone到整体配置文件,这里我已经将他备份压缩为TX2_buildCV.tar
解压缩后nano_build_opencv里面有bash自启动文件:build_opencv.sh(此文件包含了对opencv和opencv-contrib 版本的git,和自动编译配置make,我们在make中需要修改内容)
请记住,make实用程序保留了一个时间戳列表,以帮助确定是否需要重新构建某些内容。默认情况下,cp用当前时间戳标记复制的文件。这意味着如果没有保留时间戳,make将重新构建所有内容。
这个配置适用于所有型号的NVIDIA Jetsons。视频中的Jetson是NVIDIA Jetson Nano开发工具包。
对于Jetson Nano,您需要修改build_open_cv脚本。
待修改的内容有:
Jetson TX2不知道8.7 (Jetson Orin)架构
-D CUDA_ARCH_BIN = 5.3, 6.2, 7.2, 8.7
更改为
-D CUDA_ARCH_BIN = 5.3, 6.2, 7.2
并更改CUDA版本以匹配您的机器。在Jetson TX2上,这是8.2。
- d CUDNN_VERSION = ' 8.0 '
更改:
- d CUDNN_VERSION = ' 8.2 '
修改好了过后保存执行命令
./build_opencv.sh 4.8.0
如果有大佬对bash非常熟悉自己也可以优化以下代码,节省更多的时间。
检查Generate和Configuration
我这边发现无法find python3的编译器和lib以及下载的位置,按照我的猜测这个地方是因为,anaconda造成的bin文件链接问题,我暂时还在寻找解决办法。如果没有用anaconda配置过python的环境的话这个地方应该和2.7一样是能查找到默认python的。
之前是链接在anaconda上的可能当时修改的时候弄错了:
unlink /usr/bin/python3 #删除这个软连接
ln -s /usr/bin/python3.6(可执行文件)/usr/bin/python3
但是这样修改之后仍然无法识别到lib和install path,OK,没有的话就只有自己写了
PYTHON3_EXECUTABLE:
PYTHON3_LIBRARY:
PYTHON3_NUMPY_INCLUDE_DIRS:
PYTHON3_INCLUDE_DIR:
PYTHON3_PACKAGES_PATH:
这些路径都必须按照自己的版本和系统自己定义。
我觉得出现这种情况应该是,之前的conda路径对软链接进行了引导,导致系统指向没法给出明确的位置,影响了cmake的默认状态。导致python-dev也没法正常识别。所以可能大家也会使用虚拟环境进行python的调用,这里贴出我的案例。
然后就是漫长的编译链接下载(2h)左右。直到你看到
Doing so may make running tests on the build later impossible 选择N
之后根据bash文件我们编译好的文件存在了tmp下,将这些文件迁移到HOME下保存就行了。接下来import numpy和cv2出现了问题:
我们可以看到opencv.conf文件是设置正确了的,也就是说咱们的pkg-config也是没有问题的,接着我用C++跑了以下opencv的案例是没有问题的。
但是为什么import cv2和import numpy会出现segment error喃, 一般报这种问题是涉及到系统指针,内存错误啥的,因为汲取之前的经验和教训,我推测大概是编译python cv2的时候链接文件出现了问题(但因为我没专研过编译和链接)所以我只能看看import cv2到底是怎么链接的:
查看链接的文件LD_DEBUG=files
程序执行需要的文件和链接库
查看链接libs LD_DEBUG=libs
程序执行需要链接库
LD_DEGUG=files python -c "import cv2"
看到这直接心肺骤停了,原来的opencv-4.1.1的链接没有删干净自动进行了链接
现在的我也不知道怎么重新分配,干脆直接把这个build的文件夹直接清除了。重新查询链接后发现没有报错了。但重新import cv2显示找不到libopencv_img_hash.so.4.1这个文件,这个文件分明就是原来4.1.1版本的,我一脸茫然。啥都不会就直接重新编译..........
重新编译之后:但是不管怎么设置libraryPATH都一直出现这个错误,且永远4.1.1都会占用我4.8.0的链接,根据上面图我们发现,一直有个文件cv2.cpython-36m-aarch64-linux-gnu.so链接文件申请软连接这个img_hash,因为cv2.cpython-36m-aarch64-linux-gnu.so就是这个文件是针对在 Linux 上运行的 64 位 ARM 架构系统的 CPython 3.6 版本的 OpenCV 模块的共享库文件。它包含了针对特定硬件和操作系统的编译代码,可以与 Python 代码一起使用,因为我对这个共享库的配置不是很了解所以一直没在意它如果要正常工作,需要申请软链接。如果删除了其他的共享库,python在import的时候,很明显会报找不到share文件的错误,进而新编译的cv2.so也申请不到4.8.0的共享库。
unlink之后:豁然开朗!
再继续重新编译试试,然后最后找到编译生成的.so文件将它放在我们的dist-packages目录下。
然后一定要确定好numpy的版本和路径位置,如果没有识别出来版本很有可能是不兼容的。
我重新修改了一下兼容的numpy的core目录:
继续跑!
最后将cv2.cpython-36m-aarch64-linux-gnu.so改为cv2.so 并连接到python3.6文件夹下。
然后卸载掉~/.local文件夹中numpy不兼容的版本重新安装numpy==1.19.3。
漫长的两天填坑结束!!!!!
参考链接:
python2下import cv2正常,但python3找不到 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/581072793?utm_id=0&wd=&eqid=c04f40d90006d1b20000000664910ed7
LD_DEBUG的使用-CSDN博客
Ubuntu完全卸载opencv - 知乎
JetSon NANO 编译pyrealsense2运行D455 - 代码先锋网 (codeleading.com)
Jetson Xavier NX使用Yolov5+DeepStream+TensorRT实现CSI摄像头的目标识别及采坑记录 (taodudu.cc)
附加:
刷机配置可以参照这个链接GitHub - afeng616/Build-Cozy-Ubuntu-Environment: 搭建舒适的Ubuntu环境,逐步成为Ubuntu22.04重度使用者!同时包括18.04和22.04版本配置搭建舒适的Ubuntu环境,逐步成为Ubuntu22.04重度使用者!同时包括18.04和22.04版本配置 - GitHub - afeng616/Build-Cozy-Ubuntu-Environment: 搭建舒适的Ubuntu环境,逐步成为Ubuntu22.04重度使用者!同时包括18.04和22.04版本配置https://github.com/afeng616/Build-Cozy-Ubuntu-Environment
之前有个友友问为什么没法使用CUDAdnn,我现在回来看了以下之前的配置,如果Jetpack的版本过低,好像用opencv4.1.1的话是没有CUDA_dnn的编译选项的,所以不知道能否自己用命令来实现DNN编译,这次我这个版本是4.6.4,然后opencv是4.8.0的情况下在 Generate之前加上dnn编译是可以的。文章来源:https://www.toymoban.com/news/detail-602072.html
文章来源地址https://www.toymoban.com/news/detail-602072.html
到了这里,关于Nvidia Jetson TX2 配置Cuda 加速的Opencv的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!