注意版本冲突问题:
opencv2 系列和 opencv3 系列都会安装在 usr/local/ 下,并都会在 usr/local/include 文件夹下产生 opencv 和opencv2 两个文件夹,会产生冲突,所以想要同时安装 2 系列和 3 系列需要注意一下
opencv4 系列会在include下产生一个 opencv4 的文件夹,不会冲突
下载对应版本的 OpenCV
下载完成之后,把这个压缩包丢到 Ubuntu的家目录下
因为我这里用的是 WSL2 下的 Ubuntu20.04 ,所以直接复制过去就行了
然后,进入家目录,这个目录下输入指令进行解压
## 安装 unzip
sudo apt install unzip
##解压
unzip opencv-3.4.16.zip
## 进入刚刚解压好的 opencv-3.4.16文件夹
cd opencv-3.4.16
## 如果没安装 cmake,则先安装 cmake
sudo apt-get install cmake
## 安装OpenCV所需的依赖库(此安装过程有点漫长,请耐心等待)
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev
## 在opencv-3.4.16文件夹下面,再新建一个 build 文件夹
mkdir build
## 进入刚刚创建好的 build 文件夹
cd build
## 使用 cmake:设置编译参数
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
## 最后用 make 进行编译:其中 -j4 表示使用 4 个线程进行编译,编译速度会快一些,当然 -j8 更快
## 注意:还是要在 build 文件夹下面进行 make
sudo make -j4
## 编译完成之后进行 OpenCV 的安装
sudo make install
编译过程很漫长
编译完成之后,build文件夹下面多了一堆文件
安装前 /usr/local/lib
目录下只有一个 python3.8 文件夹
安装前 /usr/local/include
目录下是空的
安装后 /usr/local/lib
目录下多了一堆 opencv的库
安装后 /usr/local/include
目录下多了两个文件 opencv 和 opencv2
## 输入指令,修改 opencv.conf 文件
sudo vim /etc/ld.so.conf.d/opencv.conf
打开后的文件是空的,添加 opencv 库的安装路径:/usr/local/lib
先按下 i,进入 insert 模式,然后键盘输入内容,然后按下 esc 退出编辑模式,输入 :wq 保存并退出
## 然后:更新系统共享链接库
sudo ldconfig
## 最后:修改.bashrc进行个性化设置
sudo vim /etc/bash.bashrc
## 在文件末尾加入一段话
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
## 使配置生效
source /etc/bash.bashrc
在 vim 中输入 j,光标向下移动一行,然后 输入 i,进入 insert 模式,将内容复制进去,按下 esc 退出编辑模式,输入 :wq 保存并退出
## 更新一下
sudo updatedb
## 如果提示“command not found”
sudo apt-get install mlocate
## 再次尝试更新
sudo updatedb
## 查看安装的版本信息
pkg-config --modversion opencv
我们在家目录下,新建一个文件夹,叫做 OpenCVdmeo
mkdir OpenCVdmeo
cd OpenCVdmeo
touch test.cpp
sudo vim test.cpp
将下面内容复制进去
/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
//打开电脑摄像头
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "error" << endl;
waitKey(0);
return 0;
}
//获得cap的分辨率
int w = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
Size videoSize(w, h);
VideoWriter writer("RecordVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25, videoSize);
Mat frame;
int key;//记录键盘按键
char startOrStop = 1;//0 开始录制视频; 1 结束录制视频
char flag = 0;//正在录制标志 0-不在录制; 1-正在录制
while (1)
{
cap >> frame;
key = waitKey(100);
if (key == 32)//按下空格开始录制、暂停录制 可以来回切换
{
startOrStop = 1 - startOrStop;
if (startOrStop == 0)
{
flag = 1;
}
}
if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
{
break;
}
if (startOrStop == 0 && flag==1)
{
writer << frame;
cout << "recording" << endl;
}
else if (startOrStop == 1)
{
flag = 0;
cout << "end recording" << endl;
}
imshow("picture", frame);
}
cap.release();
writer.release();
destroyAllWindows();
return 0;
}
## 编译运行
g++ test.cpp -o test.out `pkg-config --cflags --libs opencv`
./test.out
## 查看一下摄像头的索引号
v4l2-ctl --list-devices
## 如果提示没有 v4l2-ctl,则先安装
sudo apt install v4l-utils
这是为什么呢?
在网上查了一下资料,貌似目前 WSL2 可以用 OpenCV 读图或显示视频,但是似乎不支持摄像机
不知道目前,是否有人解决了,如果有人知道解决办法,麻烦评论区告知一下,感谢!
#include
#include
using namespace cv;
using namespace std;
int main()
{
cout << "OpenCV Version: " << CV_VERSION << endl;
Mat img = imread("hahaha.jpg");
imshow("1440", img);
waitKey(0);
return 0;
}
## 编译运行
g++ test.cpp -o test.out `pkg-config --cflags --libs opencv`
./test.out
报错了!!!为啥呢 ???
因为 OpenCV 调用 imshow 函数
会去打开图像窗口,显示图片
但是我用的是 WSL2,这个子系统只有命令行,没有图形化界面,所以报错了!!!
解决办法1 :你也可以把所有的图像窗口的代码都注释了,改成保存到文件夹,运行完之后,最后去文件夹查看
解决办法2 :安装图形化界面
解决办法3 :将 WSL2 更新 为 WSLg
这里只用演示 解决办法3 :
## 在 Windows PowerShell 中更新 WSL2
wsl --update
比较简单,进入 OpenCVdmeo 文件夹
,在终端键入 code .
就可以用 VSCode 打开了
关于 VSCode 连接到 WSL2,我之前的博客有讲过:WSL2的安装与使用(Win11)
在 OpenCVdmeo 文件夹
下面,新建一个 .vscode
文件夹
然后创建三个文件:launch.json、tasks.json、c_cpp_properties.json
launch.json 文件的内容如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg", // 只能是cppdbg
"request": "launch", // launch:启动,attach:附加
"program": "${fileDirname}/${fileBasenameNoExtension}", // 需要调试的程序
"args": [], // 调试时传递给程序的参数
"stopAtEntry": false, // 调试时是否停在程序入口:{true:是,false:否}
"cwd": "${workspaceFolder}", // 工作目录
"environment": [], // 额外的环境变量
"externalConsole": false, // true:输出到外部终端 false:只输出到软件终端(有显示不全的可能)
"MIMode": "gdb",
"setupCommands": [ // 暂时不知道作用
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file", // 预编译任务名称,和tasks.json中的label必须相同
"miDebuggerPath": "/usr/bin/gdb" // 调试gdb路径
}
]
}
tasks.json 文件的内容如下:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g","-std=c++11",
//"${file}", // 单个cpp文件
"${fileDirname}/*.cpp", // 多个cpp文件
"-o",
"${fileDirname}/${fileBasenameNoExtension}", // 要调试的程序,必须与launch.json文件中的"program"相同
"-I", "${workspaceFolder}/include", // 项目include文件
"-I", "$/usr/local/include", // opencv安装的include文件路径
"-I", "$/usr/include",
"-L", "$/usr/local/lib", //opencv安装的lib文件路径
"-l", "opencv_core", //.so文件,文件原名称“libopencv_core.so”,注意需去除“lib”
"-l", "opencv_imgproc",
"-l", "opencv_imgcodecs",
"-l", "opencv_video",
"-l", "opencv_ml",
"-l", "opencv_highgui",
"-l", "opencv_objdetect",
"-l", "opencv_flann",
"-l", "opencv_imgcodecs",
"-l", "opencv_photo",
"-l", "opencv_videoio",
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "test",
"isDefault": true
},
"detail": "调试器生成任务"
}
],
"version": "2.0.0"
}
c_cpp_properties.json 文件的内容如下:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/include", //请确保你的opencv opencv2头文件夹安装在这个目录
"/usr/include"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}