WSL (Windows Subsystem for Linux) 非常好用,但是如何在里面安装OpenCV并成功调用呢?这篇博客会详细告诉你。
可以根据这篇教程安装,提醒下如果是国内用户最好换一下镜像源,更新和安装速度更快,该教程也有讲到:https://blog.csdn.net/kidcad/article/details/99445957?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase
因为现在Ubuntu已经更新到20.04 LTS focal版本了,Windows Store里面默认安装的Ubuntu是最新版也即20.04 LTS版本,如果想要安装以前的版本,那么就可以安装带版本号的版本,如下图的Ubuntu 18.04 LTS。
这是我目前的WSL版本:
顺便推荐用Windows Store里面的Terminal,很好看很好用,我目前用的就是这个。然后可以根据这个教程,把Windows Terminal添加都右键菜单,并cd到指定位置:https://blog.csdn.net/Jioho_chen/article/details/101159291
首先需要安装cmake,可以直接用apt-get进行安装,但是版本较低,也可以用源码进行编译安装,版本比较高,但是比较麻烦,低版本也是可以的,记住在CMakeLists.txt里面改CmakeVersion就行了。需要高版本可以参考这两个链接:https://www.jianshu.com/p/379f89355dc4,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
如果你没有安装git,可以安装一下,下载OpenCV可以用git clone.
sudo apt-get install git
下载地址:https://opencv.org/releases/,里面列出了不同版本以及不同来源的OPenCV,可以下载Sources或者github进行clone.
如果直接下载,下载完压缩包后解压到你想保存的位置。
如果用git clone,那么进入你要保存的位置并clone:
git clone https://github.com/opencv/opencv.git
这样clone的版本默认是最新的,也即4.3.0,如果你想要更改版本,可以 git checkout
更改版本。
首先需要再你解压或者clone的目录里面创建一个 build
文件夹,然后进入该文件夹:
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_GENERATE_PKGCONFIG=ON ..
cmake很容易失败,查看失败原因大多是因为依赖环境没有安装成功,很有可能是国内网络环境问题,检查一下你的Ubuntu源有没有更改为国内的镜像源,或者再次重新安装对应依赖。cmake成功后的结果大致是这样的(自己当时没有截图,图片来自https://linuxize.com/post/how-to-install-opencv-on-ubuntu-18-04/)
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
source /etc/bash.bashrc
用 pkg-config --modversion opencv4
或者 pkg-config --modversion opencv
检测OPenCV4或OPenCV的安装版本。
def@DESKTOP-7MMULM3:~$ pkg-config --modversion opencv4
4.3.0
def@DESKTOP-7MMULM3:~$ pkg-config --modversion opencv
3.2.0
至此OPenCV已经安装完成,如果想要测试一下在程序里面的调用的话可以接着往下看。
如果要在WSL上面运行图像化程序,需要安装一个Xserver,可以安装VcXsrv,链接:https://sourceforge.net/projects/vcxsrv/
安装完成后,需要在WSL里面config一下:
sudo vim ~/.bashrc
在末尾添加以下内容
export DISPLAY=:0.0
完成后ESC
再输入:wq
保存退出,然后记住souce
:
source ~/.bashrc
在Windows下面运行XLanuch,将 Display Number
改为0
其他就一路默认然后结束
在你的OpenCV安装包里面有样例代码,可以用于测试,比如这个路径:/opencv-4.3.0/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无法调用硬件。
如果没有该程序,可以直接复制以下代码:
#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.2.0
No capture
不是特别明白差异原因,猜测是因为CMakeLists里面指定用opencv4进行编译,但是我看了一下没有发现,也不想去深究了。
代码如下:
// opencv_demo.cpp
#include
#include
using namespace cv;
using namespace std;
int main()
{
cout << "OpenCV Version: " << CV_VERSION << endl;
Mat img = imread("Pokemon.png");
imshow("1440", img);
waitKey(0);
return 0;
}
我用这张图片进行测试,把它放在程序并行的文件夹下,命名为 Pokemon.png
.
进行编译并运行:
$ g++ opencv_demo.cpp -o opencv_demo `pkg-config --cflags --libs opencv4`
$ ./opencv_example
本文的OPenCV部分参考了这两篇博客:https://blog.csdn.net/
public669/article/details/99044895,https://linuxize.com/post/how-to-install-opencv-on-ubuntu-18-04/.