可以按照下面教程进行安装,推荐使用Windows Terminal和
wsl安装教程:
https://www.jianshu.com/p/a20c2d58eaac
Windows Terminal安装教程:
https://blog.csdn.net/engrossment/article/details/102623120
首先需要安装cmake,可以直接用apt-get进行安装,但是版本较低,也可以用源码进行编译安装,版本比较高,但是比较麻烦,低版本也是可以的,记住在CMakeLists.txt里面改CmakeVersion就行了。需要高版本可以参考这下面链接:
https://www.linuxidc.com/Linux/2018-09/154165.htm
apt安装如下:
sudo apt-get install cmake
安装完成后用cmake --version
查看是否安装完成以及版本。
def@DESKTOP-7MMULM3:~$ cmake --version
cmake version 3.10.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
安装依赖环境
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev \
libjpeg-dev libswscale-dev libtiff5-dev libgtk2.0-dev pkg-config
下载地址OpenCV和OpenCV_Contrib,里面列出了不同版本以及不同来源的OPenCV,可以下载Sources或者github进行clone。
选择需要的版本,下载Source Code即可。唯一需要注意的是OpenCV的代码要和Contrib的代码版本保持一致,否则会出错。推荐使用OpenCV-3.4.16版本,下载源码。
下载好代码后,使用tar -zxvf
命令分别解压文件,并将解压后的Contrib的文件夹放在OpenCV目录下,如下所示。
然后在OpenCV文件夹下建个build
的文件夹用于存放生成的一些文件。这样,相关文件配置就完成了
进入build文件夹,
cd opencv-3.4.16/build
配置cmake选项
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/opencv/opencv-3.4.16/opencv_contrib3.4.16/modules/ ..
其中OPENCV_EXTRA_MODULES_PATH=/home/opencv/opencv-3.4.16/opencv_contrib3.4.16/modules/ …
是指opencv_contrib-3.2.0中modules所在的路径,后面的两点不可省略
如果不安装opencv_contrib配置选项为
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_GENERATE_PKGCONFIG=ON ..
cmake很容易失败,查看失败原因大多是因为依赖环境没有安装成功,很有可能是国内网络环境问题,检查一下你的Ubuntu源有没有更改为国内的镜像源,或者再次重新安装对应依赖。
cmake结束后进行make编译
sudo make -j8
完成后再进行安装
sudo make install
sudo vim /etc/ld.so.conf
在里面加上一行 /usr/loacal/lib
,其中 /user/loacal
是opencv安装路径也就是makefile中指定的安装路径,结果如下:
include /etc/ld.so.conf.d/*.conf
/usr/local/lib
完成后ESC
再输入:wq
保存退出。
运行
sudo ldconfig
然后修改bash.bashrc
文件
sudo vim /etc/bash.bashrc
在文件末尾加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
然后进行souce,更新环境变量
source /etc/bash.bashrc
用 pkg-config --modversion opencv4
或者 pkg-config --modversion opencv
检测OPenCV4或OPenCV的安装版本.
$ pkg-config --modversion opencv
3.4.16
至此OPenCV已经安装完成,如果想要测试一下在程序里面的调用的话可以接着往下看。
如果要在WSL上面运行图像化程序,需要安装一个Xserver,推荐从SourceForge中安装VcXsrv,使用默认安装.
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install xfce4
sudo apt install xfce4-session
DISPLAY
环境变量由于WSL2
其实是用Hyper-V
技术实现的一个虚拟机,和WSL1
的工作原理不一样,因此如果使用之前网上的方法直接设置DISPLAY=:0.0
的话,启动xfce4的时候会出现下面的错误:
lpwm@DESKTOP-FI0NTIP:~$ startxfce4
/usr/bin/startxfce4: X server already running on display :0.0
xrdb: Connection refused
xrdb: Can't open display ':0.0'
Unable to init server: Could not connect: Connection refused
xfce4-session: Cannot open display: .
Type 'xfce4-session --help' for usage.
需要在WSL里面config一下:
sudo vim ~/.bashrc
在末尾添加以下内容
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0
然后source使得配置生效
source ~/.bashrc
配置防火墙,外界网络访问 VcXsrv 的端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0lJ7Gif-1636711152833)(https://raw.githubusercontent.com/Toyakoyo2018/picBed/master/img/20211112174221.webp)]
Display settings: One large window
How to start clients: Start no client
Disable access control: Yes:一定要选这一项,WSL 2 相当于远程(外界)网络了,和 Windows 10 是分开的,和 WSL 1 不一样
完成后,单击“完成”以启动X服务器。如果Windows防火墙提示,请确保允许从公用网络和专用网络都连接到 VcXSrv。双击系统任务栏中的X图标,将 VcXSrv 带入前台。现在,您将看到黑屏,因为 Linux 中还没有运行图形化的 X11 应用程序。
sudo apt install x11-apps
xclock
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TZPyU3dU-1636711152838)(https://raw.githubusercontent.com/Toyakoyo2018/picBed/master/img/20211112175140.webp)]
startxfce4
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VG01IOn5-1636711152839)(https://raw.githubusercontent.com/Toyakoyo2018/picBed/master/img/20211112175226.png)]
在你的OpenCV安装包里面有样例代码,可以用于测试,比如这个路径:/opencv-3.4.16/samples/cpp/example_cmake
,如此测试
$ cmake .
$ make
$ ./opencv_example
输出
Built with OpenCV 4.3.0
[ WARN:0] global /mnt/d/Programs/OpenCV/opencv-4.3.0/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video0): can't open camera by index
No capture
以及会出现这个(左上角"Hello OpenCV"的黑幕),没有camera被调用是正常现象,因为WSL无法调用硬件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pjkalEdH-1636711152839)(https://raw.githubusercontent.com/Toyakoyo2018/picBed/master/img/20211112175741.png)]
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#include
using namespace cv;
using namespace std;
void drawText(Mat & image);
int main()
{
cout << "Built with OpenCV " << CV_VERSION << endl;
Mat image;
VideoCapture capture;
capture.open(0);
if(capture.isOpened())
{
cout << "Capture is opened" << endl;
for(;;)
{
capture >> image;
if(image.empty())
break;
drawText(image);
imshow("Sample", image);
if(waitKey(10) >= 0)
break;
}
}
else
{
cout << "No capture" << endl;
for(;;)
{
image = Mat::zeros(480, 640, CV_8UC1);
drawText(image);
imshow("Sample", image);
waitKey(0);
}
}
return 0;
}
void drawText(Mat & image)
{
putText(image, "Hello OpenCV",
Point(20, 50),
FONT_HERSHEY_COMPLEX, 1, // font face and scale
Scalar(255, 255, 255), // white
1, LINE_AA); // line thickness and type
}
然后进行编译再运行:
$ g++ example.cpp -o opencv_example `pkg-config --cflags --libs opencv`
$ ./opencv_example
输出的图形界面一样,但是文字输出有区别:
Built with OpenCV 3.4.16
No capture