ORIN上的openCV编译安装 cuda加速和gstream编译
一. 卸载Jetpack安装的默认openCV
- 输入命令
sudo jtop
- 按数字6查看INFO页面,可以看到openCV版本信息
openCV: 4.6.4 complied CUDA: NO
- 所哟默认的openCV版本没有CUDA加速,无法利用ORIN的GPU性能
二. 卸载openCV
- 卸载默认版本的openCV
sudo apt purge libopencv*
sudo apt autoremove
sudo apt update
- 卸载其他版本的openCV
cd .../opencv-4.6.0/build
sudo make uninstall
cd .../opencv-4.6.0
sudo rm -r build
三. 安装依赖项及解决报错
1. 依次输入以下命令
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 libpng-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 python3-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
- 出现问题及问题解决方案
-
若遇到第一条命令无法跑通则先换源
# 默认注释了源码仓库,如有需要可自行取消注释 deb [arch=arm64] http://mirrors.ustc.edu.cn/ubuntu-ports/ focal main restricted universe multiverse # deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal main main restricted universe multiverse deb [arch=arm64] http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse # deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse deb [arch=arm64] http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse # deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse deb [arch=arm64] http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse # deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
-
若遇到无法定位libjasper-dev软件包,执行如下命令即可安装
- 方法一:
sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe" sudo apt update sudo apt install libjasper1 libjasper-dev
- 方法二:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" sudo apt update sudo apt install libjasper1 libjasper-dev
-
四. 下载 OpenCV 和 opencv_contrib 源码
- 分别前往 OpenCV 和 opencv_contrib 的 github 仓库下载 Latest release 源码 ( 👈 点击超链接跳转)
- 点击红框所标注的位置即可下载
- 注意 OpenCV 和 opencv_contrib 的版本要对应正确
五. 编译和安装 OpenCV
-
将 opencv-4.6.0.zip 和 opencv_contrib-4.6.0.zip 放在同一文件夹并解压,将解压后的opencv_contrib-4.6.0放在opencv-4.6.0文件中!
- 执行如下命令
cd opencv-4.6.0 mkdir build cd build
-
执行cmake进行构建
cmake -D CMAKE_BUILD_TYPE=RELEASE\ -D CMAKE_INSTALL_PREFIX=/usr/local\ -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules\ -D CUDA_ARCH_BIN='8.7'\ -D CUDA_ARCH_PTX='8.7' \ -D WITH_CUDA=1\ -D BUILD_opencv_python3=1\ -D BUILD_opencv_python2=1\ -D WITH_FFMPEG=1 \ -D WITH_V4L=ON\ -D WITH_QT=ON\ -D WITH_OPENGL=ON\ -D ENABLE_FAST_MATH=1 \ -D CUDA_FAST_MATH=1\ -D WITH_CUBLAS=1\ -D OPENCV_GENERATE_PKGCONFIG=1\ -D WITH_GTK_2_X=ON\ -D WITH_GSTREAMER=ON\ ..
- CMAKE_BUILD_TYPE=RELEASE ~~~~~~ # 表示编译发布版本
- CMAKE_INSTALL_PREFIX=/usr/local ~~~~~~ #指定安装路径
- OPENCV_EXTRA_MODULES_PATH=…/opencv_contrib/modules opencv——contrib modules ~~~~~~ #路径
- CUDA_ARCH_BIN=‘8.7’ ~~~~~~ #指定GPU算力,可以在NVIDIA官网查询,也可以使用jtop查询
- WITH_CUDA=1 ~~~~~~ # 使用CUDA加速
- WITH_GSTREAMER=ON ~~~~~~ #如果使用openCV的Gstreamer包,这里设置为ON
- 执行完之后在build目录下查找download_with_wget.sh文件,如果这个文件不存在说明第三方依赖全部下载成功,下载的文件全部默认在opencv-master文件夹的“.cache”目录下,大概111.5MB
-
编译openCV
-
注意,如果安装有anaconda,建议执行以下命令,关闭anaconda环境
-
似乎是conda屏蔽了某些系统库,导致编译时链接到了conda的库而引起冲突,编译CUDA相关的模块会出错。如果系统有安装conda,在编译之前要屏蔽conda。注意是在构建之后,编译之前。
-
1.终端中关闭conda环境
``` conda deactivate ```
-
2.修改bashrc配置文件,屏蔽anaconda环境
``` # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/home/nvidia/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/home/nvidia/anaconda3/etc/profile.d/conda.sh" ]; then . "/home/nvidia/anaconda3/etc/profile.d/conda.sh" else export PATH="/home/nvidia/anaconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<< ```
-
将conda的环境配置命令使用#注释掉
-
更新被指文件
source ~/.bashrc
-
重新打开终端后 ~~ (bash)消失
-
-
-
开始编译
make -j7 # 设置编译使用的线程数
- jx中x表示使用几线程进行源码编译,可以使用jtop查看设备线程数量。
-
-
编译完成,安装openCV
sudo make install
- 至此openCV安装完成,编译生成的安装文件都会复制到CMAKE_INSTALL_PREFIX为前缀的目录下。
六. 环境配置
- 配置链接库,使用了opencv库的程序在运行时会通过这个配置链接库,否则即使代码编译成功也无法运行(可以先跳过这一步,后续测试就会发现display.cpp编译成功但找不到库以致无法运行)。
apt-get install pkg-config
gedit /etc/ld.so.conf.d/opencv.conf # (打开后加入/usr/local/lib(构建编译文件时的路径CMAKE_INSTALL_PREFIX/lib ),然后保存退出)
sudo ldconfig
- 配置pkg-config方便编译小型OpenCV程序
sudo /etc/bash.bashr
# 在文档最后加入openCV的环境配置路径,下面两行
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:<CMAKE_INSTALL_PREFIX>/lib/pkgconfig
export PKG_CONFIG_PATH
source /etc/bash.bashrc # 更新配置环境
- 环境配置验证
find ./ -name opencv4.pc
# ./unix-install/opencv4.pc
pkg-config --cflags opencv4
# -I/usr/local/include/opencv4
七. 验证测试
- 1.使用jtop查看openCV配置,编译配置正确输出如下
openCV: 4.6.0 compiled CUDA: YES
- 2.使用以下命令查看openCV的版本号
pkg-config --modversion opencv4
- 3.程序测试
- 编写一个简单程序display.cpp测试编译和环境配置是否成功。读取图像并显示和打印图像的尺寸:
- 程序如下
#include<iostream> #include<string> #include<opencv2/core.hpp> #include<opencv2/highgui.hpp> int main(int args, char** argv){ std::string filename = "/home/<user_name>/picture/xx.jpg"; if (args >= 2){ filename = argv[1]; std::cout << "Image file: " << filename << std::endl; } cv::Mat image = cv::imread(filename, cv::IMREAD_COLOR); if (image.empty()){ std::cout << "please input an image file path." << std::endl; return 0; } std::cout << "Image size is: " << image.size() << std::endl; cv::namedWindow("image", cv::WINDOW_NORMAL); cv::imshow("image", image); cv::waitKey(0); cv::destroyAllWindows(); return 0; }
- 编译:
g++ display.cpp -o display `pkg-config --cflags opencv4 --libs opencv4`
-
`是ESC键下面那个键输入的符号,不是单引号’。
-
运行:
./display /home/<user_name>/picture/xx.jpg