记录在ubuntu上,基于源码安装单个opencv和多个opencv
1、单版本安装
1.1、安装依赖
在终端中安装依赖:
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
1.2、下载源码安装
去官网下载sources源码,版本选择第二个(最新的可能存在不稳定或其他bug,选第二个可能会稳定点)
下载到本地后解压(最好不要存在中文或奇怪字符的路径),在命令行中进入opencv-version文件夹,创建并进入build文件夹mkdir build && cd build
,cmake编译cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_ENABLE_NONFREE=True ..
(这里可能会卡在:IPPICV: Download: ippicv_2020_lnx_intel64_20191018_general.tgz 或者:ADE: Downloading v0.1.2a.zip from https://github.com/opencv/ade/archive/v0.1.2a.zip)等地方,因为是从raw.githubusercontent.com下载,众所周知这是不稳定的网站。网上也有其他解决方法,比如手动下载等,我觉得都太麻烦,不如重启几次,说不定就能访问了,至少我是这样的
结束后执行make指令(当然可以多线程,先nproc命令查询你的线程数,我的是20,所以使用j15指定15个线程)sudo make -j15
,这段等待时间较长。
完成后,指定sudo make install
即可
1.3、环境配置
在cmake命令中设置了OPENCV_GENERATE_PKGCONFIG=ON
,所以在/usr/local/lib/pkgconfig
中生成了opencv4.pc文件,里面记录了opencv头文件、库文件的路径
,现在配置一下(应该是环境变量一类,将其暴露给全局变量)
通过sudo vim /etc/bash.bashrc
打开后在最后追加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存退出后,更新source /etc/bash.bashrc
修改动态库:通过sudo vim /etc/ld.so.conf.d/opencv.conf
,在里面添加/usr/local/lib
,然后保存退出,再更新一下sudo ldconfig
1.3、检查校验
#终端输入以下两命令,显示正常则安装成功
pkg-config --modversion opencv4 #查看版本号
pkg-config --libs opencv4 #查看libs库
除此之外,opencv源码提供了测试程序,位于opencv-version/samples/cpp/examples_cmake
,在终端进入该文件夹,然后:
mkdir build
cd ./build
cmake ..
make
./opencv_example 执行该可执行文件
会弹出一个框并显示“Hello OpenCV”
注意:在cmake阶段,如果cmake文件中需要opencv,则在编译时会打印找到的opencv路径,可以以此判断是否是期望的opencv版本
1.4、在vscode中测试
vscode安装不说了,现在在vscode中新建一个opencvtest.cpp文件,内容为:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc,char** argv){
// 注意这里修改成你的图片路径
Mat src = imread("test.jpeg",IMREAD_GRAYSCALE); //读取图片
if (src.empty()) { //判断是否找到图片
printf("没有找到图片 "); //输出文字
return -1;
}
else
{
namedWindow("input",WINDOW_AUTOSIZE);// 显示窗口命名为input ;WINDOW_AUTOSIZE显示大小为图片自定义大小,且不可以更改大小
imshow("input",src); //显示
waitKey(0);//显示的毫秒时间,如果函数参数<=0表示一直显示。>0表示显示的时间
destroyAllWindows();
return 0;
}
}
c_cpp_properties.json
在.vscode文件夹的c_cpp_properties.json中,includePath下添加"/usr/local/include/opencv4"
(解决检测到 #include 错误。请更新 includePath。已为此翻译单元(/home/zjgdyjy/WorkSpace/tensorrtx-master/yolov5/CutImage/opencvtest.cpp)禁用波形曲线。)
task.json
快捷键shift+ctrl+p搜索全局命令tasks,选择g++ 生成活动文件,配置内容:
// 节选
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.out",
// 解决opencv2/opencv.hpp: 没有那个文件或目录
"`pkg-config","--libs","--cflags","opencv4`" //这是添加第三方库代码,要添加什么库直接继续加就行,不要忘记了 ` 符号
//如下面再加个 gazebo11 第三方库(你得保证你安装的第三方库中含有.pc文件)
// "`pkg-config","--libs","--cflags","opencv4,gazebo11`"
],
launch.json
运行——>添加配置——>C++(GDB/LLDB)——>
{
"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"
}
如果想生成一个终端可以改:“externalConsole”: true ,弹出命令窗口
2、卸载
有时候需要卸载opencv,这里记录步骤。在安装步骤中执行cmake -D CMAKE_BUILD_TYPE=RELEASE ..
后显示如下,当执行sudo make install
后会被安装到/usr/local
中,
并且在sudo make install
后,会显示详细的安装日志:
-- Installing: /usr/local/include/opencv4/opencv2/cvconfig.h
-- Installing: /usr/local/lib/cmake/opencv4/OpenCVModules.cmake
-- Installing: /usr/local/share/opencv4/valgrind.supp
-- Installing: /usr/local/bin/opencv_annotation
总结就是安装到了/usr/local/include/opencv*
、/usr/local/share/opencv*
、/usr/local/lib/libopencv*
、/usr/local/bin/opencv*
下。
如果是通过源码安装的,进入编译时创建的build目录,然后执行sudo make uninstall
会自动删除相关文件。如果编译的项目已经被删除了,可以下载源码重新编译,但是注意cmake -D CMAKE_INSTALL_PREFIX=/usr/local
中CMAKE_INSTALL_PREFIX应当保持和之前安装时一样。一般来说默认在/usr/local
中,可以查看/usr/local/lib
中是否存在大量libopencv*.so
库文件验证。
3、安装多个版本
下载指定版本的源码后依此执行:
mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr/local/opencv_4.8.1 -D CMAKE_BUILD_TYPE=Release -D OPENCV_ENABLE_NONFREE=True ..
make -j8 # 8代表开8个线程去处理,可以设置为 2,4,6等
sudo make install
其中CMAKE_INSTALL_PREFIX
可以理解为安装路径,基于此可以将不同版本的opencv安装到不同文件夹中,这里安装4.8.1版本。
安装后在/usr/local
下可以看到两个opencv
在项目中使用CMakeLists.txt管理时,如下添加opencv:
# 在代码中引入头文件opencv2/opencv.hpp,即在/usr/local/opencv_4.5.5/include/opencv4中的opencv2/opencv.hpp
include_directories(/usr/local/opencv_4.5.5/include/opencv4)
link_directories(/usr/local/opencv_4.5.5/lib)
# 链接要使用的库,比如opencv_highgui是和waitKey()相关的
target_link_libraries(main opencv_core opencv_imgcodecs opencv_imgproc opencv_dnn opencv_highgui)