0


Vscode上使用opencv(C++接口,Windows篇)

Vscode上使用opencv(C++接口,Windows篇)


opencv是任何一个学习或者对视觉算法感兴趣的同学几乎都会用的一个库,Python接口的opencv玩了一阵子了,最近心血来潮,想要玩玩opencv的C++接口。

如果你是使用的Python,安装opencv极其简单:

$pip install opencv-python

但是如果你是一个热衷于不使用集成开发工具手撸C++代码的同好,那么对于一个不是很熟悉C++编译器结构的小白来说,安装和使用过程就会被迫带上痛苦面具。

小白,指,这么几个名字得知道是什么意思:1. MinGW 2. 链接器。不知道最好去查一下,有一个大概的了解就行,因为认知的建立只是为了增加你的观看体验。嗯哼,让我们来一个series的chill music~~~

我看了一下,网上大多数关于opencv安装和使用的教程都是linux下或者使用VS这样的大型工具来说的,怎么说呢,这么做很好,但是对于我来说,一来不够general,二来不够优雅。我喜欢一个命令行走天下,挺多加一个vscode。而且在私人机子上使用Linux的人并不多,安装一个VS又能再次上演C盘容量消失术,实属治好了一部分人的低血压。让我当场表演一个尺缩效应。

所以问题在于,如何使用安装和运行opencv?Fine,首先我们的弄清楚两个问题:

  1. 安装和运行是不同的,安装你需要大致了解MinGW的目录结构,运行则需要考虑编译参数和链接器的要求。
  2. vscode只是一层皮,按照本文的要求配好后,只用vim你也能在Windows上优雅地运行你的opencv程序。

所以本文我会分开来,讲讲如何使用gcc编译套组(包括你的g++编译器啦)来在Windows上成功编译一个opencv程序并使用vscode来让这个过程变得更加便捷和优雅。



在Windows上安装gcc支持的opencv有两种方法——懒人版和手动编译版,我猜你们应该都喜欢第一种吧。

懒人版

原料:

  • 地球人使用的IO设备
  • MinGW编译器(8.1.0的版本)

opencv发布的软件包中貌似并没有Windows下使用g++预先编译好的版本,所以我们需要手动编译一把,我知道对于小白来说,编译大型C++项目就是噩梦,我也是,所以我预先编译好了一份(其实我编译了一上午,因为电脑环境变量太杂了,出了很多问题,最后还是请的我的超人同学

编译好的build,champion,我的超人!!!)我将构建完的build扔到gitee上去了,100多MB的样子,链接如下:

我还放了一本opencv的圣经在这个仓库里,自取啦,不用感谢我,因为我也是白嫖的hhh。

动图封面

然后请按照以下的步骤:

  1. clone这个仓库,然后找到build文件夹
  2. 找到你的MinGW编译器的文件夹,进入mingw64文件夹
  3. 将build文件夹下的bin文件夹的路径加入环境变量
  4. 将build文件夹下的include和lib文件夹合并到mingw64文件夹下的include文件夹和lib文件夹中去
  5. 安装完成~~~

如何检验我会后面说

手动编译版

原料:

  • 地球人使用的IO设备
  • MinGW编译器(8.1.0的版本)
  • Cmake套件

去拜访一下大慈善家的网站:Releases - OpenCV ,点击Sources按钮。(我安装的是4.5.2的,尽量别去安装最新版,那有可能不stable)

下载完源码后找一个目录解压,得到源代码文件夹sources,解压打开,应该长这样:

然后我们打开cmake-gui.exe,打开方式有两种:直接搜索cmake-gui:

或者在命令行输入cmake-gui.exe(如果你的cmake加入了环境变量,那么只输入cmake再按tab就会自动补全为cmake-gui.exe),然后回车即可。

打开了cmake-gui.exe,我们首先需要确认编译目录和构建目录:

然后点击配置,也就是Configure,选择MinGW Makefiles:

点击finish,系统就会开始检查配置,下方的控制台会开始打印调试信息。等待结束。

结束后,cmake可能会显示一片红,此时请再次点击Configure,结束后将屏幕中仍然为红的选项勾掉,然后再配置,直到没有红色为止。然后点击Generate,准备生成最终的Makefile:

此时点击你自己创建的那个存在最终构建的目录,你会发现这个文件夹中不仅有了一堆文件,而且出现了一个Makefile文件。

Fine,在这个文件夹中打开你亲爱的命令行,输入如下:

然后开始编译,编译时间很久,差不多一顿午餐的时间吧,所以建议吃饭前做:

编译完成后,只需要拿走bin,include和lib文件夹就行了。

接下来的操作就和懒人版的一样了。


配置运行参数

为了让诸位读者明白opencv如何手动编译而不同于部分博文直接丢给VS编译的做法(2233不做评论),在讲解如何在vscode中优雅编写opencv之前,我会先带着大家用纯命令行来实现一个简单的opencv程序。找一个地方打开你的命令行,并在你打开命令行的地方准备一张图片。然后输入:

进入vim编辑模式(没有vim的同学也可以用任何的文本编辑器),在hello_opencv.cpp中输入以下内容:

#include "opencv2/opencv.hpp"
#include "iostream"

int main(int argc, char const *argv[])
{
    cv::Mat img = cv::imread("./x1.png");
if (img.empty())
std::cout << "image is empty or the path is invalid!" << std::endl;
cv::imshow("Origin", img);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}

保存退出。

我们需要使用的编译参数如下:

-std=c++14 -I D:\\MinGW\\mingw64\\include -lopencv_core452 -lopencv_imgcodecs452 -lopencv_imgproc452 -lopencv_calib3d452 -lopencv_dnn452 -lopencv_features2d452 -lopencv_flann452 -lopencv_gapi452 -lopencv_highgui452 -lopencv_ml452 -lopencv_objdetect452 -lopencv_photo452 -lopencv_stitching452 -lopencv_video452 -lopencv_videoio452

其中:

  • -std=c++14:代表我们使用c++14标准来编译这段代码;
  • -I D:\MinGW\mingw64\include:告诉预处理器include目录的路径,好让预处理器去找头文件和部分代码,然后粘到我们的这段代码里面去。
  • 一堆-lopencv_core452这样的东西:这些都是曾经的build文件夹的lib目录下的静态库文件。告诉链接程序需要使用的静态库文件,好让链接器把汇编器生成的机器码和静态库直接黏在一块,让它们如胶似漆。

gcc套组的基本编译指令就不要我多讲了吧,我还是讲一下吧:

$g++ -g <i1.cpp, i2.cpp, ...> -o o1.exe

那么最终总的编译指令就是:

$g++ -g .\hello_opencv.cpp -std=c++14 -I D:\\MinGW\\mingw64\\include -lopencv_core452 -lopencv_imgcodecs452 -lopencv_imgproc452 -lopencv_calib3d452 -lopencv_dnn452 -lopencv_features2d452 -lopencv_flann452 -lopencv_gapi452 -lopencv_highgui452 -lopencv_ml452 -lopencv_objdetect452 -lopencv_photo452 -lopencv_stitching452 -lopencv_video452 -lopencv_videoio452 -o hello_opencv.exe

就像这样哦:

然后我们可以ls查看一下hello_opencv.exe在不在当前的文件夹下,也可以直接将我们构建好的程序载入内存:

效果就是会读入你放入的一张图片,然后展示啦,当图片窗口得到焦点时(位于所有窗口最上层时),触发任意的键盘事件都会使得窗口退出,这就是最终的效果:


All science and no art makes Jack a dull boy

我知道我知道,许多大佬都能用vim玩出花来,前些日子还看到有一位精神小伙用vim+LaTex编译器记数学笔记。但是我还是很喜欢vscode,因为强大的LSP(语言参数服务器)和插件市场,所以,接下来我想说的是如何将上述的手动编译的过程迁移到vscode中,并让整个过程更加便捷,愉快,优雅。

首先先装一点插件,先安装C++的补全,高亮插件,直接搜C\C++就行:

为了更加方便地执行代码,我们安装一下你大概率早就安装过的插件Code Runner:

Code Runner会为多种编程语言预先写好一下编译执行或者解释执行的代码,当然,由于我们这边花里胡哨需要一堆的额外编译参数,所以我们需要去修改Code Runner的默认参数,按下Ctrl + 逗号,或者点击左下角的齿轮按钮点击设置。然后搜索code runner,点击红框框框中的选项的“在setting.json中编辑”链接,如下图:

找到cpp选项,没错,我们要修改code runner对所有的后缀为.cpp的文件的默认执行动作:

可以看到,默认的编译指令就是裸的hhh,我们需要在其中加上必要的编译参数。直接将"cpp"这个键值参数改为如下就行:

"cpp":"cd $dir && g++ $fileName -o $fileNameWithoutExt -std=c++14 -I C:\\Qt\\Tools\\mingw1120_64\\include -lopencv_core460 -lopencv_imgcodecs460 -lopencv_imgproc460 -lopencv_calib3d460 -lopencv_dnn460 -lopencv_features2d460 -lopencv_flann460 -lopencv_gapi460 -lopencv_highgui460 -lopencv_ml460 -lopencv_objdetect460 -lopencv_photo460 -lopencv_stitching460 -lopencv_video460 -lopencv_videoio460 && $dir$fileNameWithoutExt",

改完之后一大长条:

OK,现在打开我们之前创建的hello_opencv.cpp文件,改一下图片路径,确保图片路径有效,然后按下Ctrl+Alt+N,程序就开开心心执行啦。漂亮的界面总是能给开发者带来意料之外的笑容:


更大,更好,更强的Vscode

你会发现,虽然现在方便多了,但是vscode却无法自动补全,甚至上面linter还划着红线来让威胁我们时刻挂在嘴角的笑容,那怎么改好这个毛病呢?首先我们得知道为什么会出现这样的情况,因为我们安装的C++补全插件只内置了一些标准库的补全linter,对于我们新添加的opencv,它根本不知道这个库的安装目录在哪里,那么凭什么还期待它能够为你补全呢?

所以我们需要告知vscode的C++linter我们现在正在使用的C++编译器的第三方库的目录在哪里,vscode中这类操作通过配置文件完成,按下Ctrl+Shift+P打开vscode的内置命令块,输入C++ Configurations,找到下图这个选项:

按下回车,vscode便会在当前工作目录生成一个.vscode文件夹,其中创建一个c_cpp_properties.json这样的配置模板文件。找到"includePath"这一项,填入你正在使用的编译器的include目录即可:

这样一来,我们的C++的linter就知道你的include文件夹的位置,继而对其中的文件目录和头文件做一波解析,你就可以开始愉快地享用自动补全了:

顺便一提,默认生成的c_cpp_properties.json使用的linter是基于微软家的Cpp编译器的,为了不必要的误会,我们可以将c_cpp_properties.json修改如下:

大概就是这样喽,enjoy~~~


关于视频读入的一点问题

如果你在使用opencv读视频时发现读入的视频一闪而过,那说明可能是缺少有关ffmpeg的动态库。别担心,我上传的版本中已经加入了这个动态链接库;如果你是手动编译的,那么可以去官网上下载相应版本的Windows包,在build文件夹的bin中应该只有一个文件,把这个文件拷贝到你自己的build文件夹的bin下就好了。

标签: opencv vscode c++

本文转载自: https://blog.csdn.net/feichangyanse/article/details/128083685
版权归原作者 非常颜色 所有, 如有侵权,请联系我们删除。

“Vscode上使用opencv(C++接口,Windows篇)”的评论:

还没有评论