由于已经安装了驱动,直接看nvida-smi,支持的最高CUDA版本是12.2,好像听说Pytorch最高支持到12.1,所以选择了12.1,具体安装参见
ubuntu22.04安装显卡驱动、CUDA及cudnn以及Ubuntu20.04安装cuDNN(包括WSL),里面介绍的很详细了。
在安装前,首先安装相应的依赖项
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
其中,libjasper-dev的安装会出现问题,提示无法定位该包
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
运行上述命令,又会提示出现以下提示:
W: GPG 错误:http://security.ubuntu.com/ubuntu xenial-security InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
E: 仓库 “http://security.ubuntu.com/ubuntu xenial-security InRelease” 没有数字签名。
N: 无法安全地用该源进行更新,所以默认禁用该源。
N: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。
解决方案如下:没有数字签名,禁用该源
还有这个ubuntu22.04(opencv安装):python-dev、python-numpy、libdc1394-22-dev无法安装问题
Ubuntu18.04安装opencv4.5.1+contrib 支持cuda加速(附带编译好的opencv4.5.1及缺失文件)
Ubuntu系统编译opencv4.0以上以及opencv_contrib
Ubuntu20.04安装opencv4.4.0+opencv-contrib4.4.0 及错误
这几篇文章里面介绍的比较详细了,另外,我还在ippicv这里卡了很久,可以参见这篇文章
OpenCV中手动安装ippicv(ubuntu)
[学习笔记-OpenCV篇]opencv ippicv下载超时-无法下载问题解决
Ubuntu opencv 坑
但是其中需要将下载好的文件替换掉链接的部分,到底应该写成
file:/home/rotga/opencv/opencv-4.8.0/3rdparty/ippicv/
还是
file:///home/rotga/opencv/opencv-4.8.0/3rdparty/ippicv/
还是没有搞清楚,最后我写的是上面的。
利用cmake的gui预编译时,第一次编译opencv主体过去后,还需要搜索nonfree,将其打上勾,搜索extra,将扩展包的module文件夹的路径填入,再搜索wechat,将其不要打勾,搜索qt,不要打勾,搜索face,不要打勾,所有xfeature2d,不要打勾,搜索cuda,打上勾,再次config,没有红字产生后,再次搜索cuda,有个fastmath,打上勾,搜索test,将所有小写的test的项都不要打勾。generate。
下面就开始编译,还是在这个打开camke gui 的文件夹下,命令行输入
sudo make -j16
因为我的CPU是16核,所以用16的参数。
Ubuntu20.04/Ubuntu22.04 配置VScode+Opencv+cmake(C++)
经过查找资料,目前我的VSCODE的配置如下:
c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/include/opencv4/**", //记得把opencv4的include路径包含,按我上述方法来安装opencv的话一般就是这个路径
"/usr/include/opencv4/**",
"/usr/include/x86_64-linux-gnu/sys" //这是装了cuda的路径,如果无cuda请去除
"/opt/ros/humble/**" //这是ROS2里面的头文件包含目录
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
//"command": "/usr/bin/cpp", //不能用这命名, 否则你可能会i报错 gdb failed with message 'file format not recognized'
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.out",
"`pkg-config","--libs","--cflags","opencv4`" //这是添加第三方库代码,要添加什么库直接继续加就行,不要忘记了 ` 符号
//如下面再加个 gazebo11 第三方库(你得保证你安装的第三方库中含有.pc文件)
// "`pkg-config","--libs","--cflags","opencv4,gazebo11`"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
launch.json
{
"configurations": [
{
"name": "C/C++: cpp 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.out",
"args": [
"`pkg-config","--libs","--cflags","opencv4`",
],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file", //要和 task.json的label字段一致
"miDebuggerPath": "/usr/bin/gdb",
//下面这行命令可以去除Vscode中编译后出现 [1]+ Done.... 的提示
"miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /usr/bin/gdb -q --interpreter=mi"
}
],
"version": "2.0.0"
}
需要注意的是,在tasks.json和launch.json中的args字段中都有"pkg-config","--libs","--cflags","opencv4
",这一行,经过试验和查找资料,发现,tasks.json中的这行控制着所用opencv版本,即编译要使用该版本的库。而我的计算机中,目前装着两个版本的OPENCV,一个是ros2自带的4.5.4和自己安装的4.8.0,前者装在/usr下,对应的库是在/usr/lib头文件是在/usr/include/opencv4下面,而后者是安装在/usr/local下,对着的库是在/usr/local/lib头文件是在/usr/local/include/opencv4下面,这两个对应的pkgconfig文件夹是在/usr/lib和/usr/local/lib下,(后者在编译时默认不产生pc文件,这个在安装时没有注意,后来自己创建的),前者的pc文件是opencv4.pc,后者是opencv.pc(自己创建的)。经过对比,发现,ros2自带的opencv虽然版本不是最新,但是编译出来的包是最全的,包括了所有opencv的包。对于目前的我而言,应该是够用了。
废话不多说,贴上cmakelists的代码。在此之前说一句,没有经过任何配置,即在默认状态下,CLion也是可以编译出含opencv的程序的,而且是使用的自己安装的opencv4.8.0,而且是在自己创建opencv.pc之前,这就有点奇怪了。
cmake_minimum_required(VERSION 3.26)
project(firstProject)
set(CMAKE_CXX_STANDARD 11)
#set(OpenCV_DIR "/usr/local/lib/cmake/opencv4/") # 如需使用自己安装的opencv4.8.0,启动此行
set(OpenCV_DIR "/usr/lib/x86_64-linux-gnu/cmake/opencv4") # 如需使用ROS2自带的opencv4.5.4,启用此行
#set(TARGET_LIBS "/usr/local/include/opencv4/opencv2/") # 如需使用自己安装的opencv4.8.0,启动此行
set(TARGET_LIBS "/usr/include/opencv4/opencv2/") # 如需使用ROS2自带的opencv4.5.4,启用此行
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/lib)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(firstProject ${OpenCV_LIBS})
其中,firstProject是我的项目名称。
当然,把这些配置写上去后,CLion就会根据配置选用不同的opencv版本。