重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
opencv是任何一个学习或者对视觉算法感兴趣的同学几乎都会用的一个库,Python接口的opencv玩了一阵子了,最近心血来潮,想要玩玩opencv的C++接口。
成都创新互联是一家成都网站设计、成都网站制作,提供网页设计,网站设计,网站制作,建网站,按需网站开发,网站开发公司,公司2013年成立是互联行业建设者,服务者。以提升客户品牌价值为核心业务,全程参与项目的网站策划设计制作,前端开发,后台程序制作以及后期项目运营并提出专业建议和思路。如果你是使用的Python,安装opencv极其简单:
$pip install opencv-python
但是如果你是一个热衷于不使用集成开发工具手撸C++代码的同好,那么对于一个不是很熟悉C++编译器结构的小白来说,安装和使用过程就会被迫带上痛苦面具。
小白,指,这么几个名字得知道是什么意思:1. MinGW 2. 链接器。不知道最好去查一下,有一个大概的了解就行,因为认知的建立只是为了增加你的观看体验。嗯哼,让我们来一个series的chill music~~~
我看了一下,网上大多数关于opencv安装和使用的教程都是linux下或者使用VS这样的大型工具来说的,怎么说呢,这么做很好,但是对于我来说,一来不够general,二来不够优雅。我喜欢一个命令行走天下,挺多加一个vscode。而且在私人机子上使用Linux的人并不多,安装一个VS又能再次上演C盘容量消失术,实属治好了一部分人的低血压。让我当场表演一个尺缩效应。
所以问题在于,如何使用安装和运行opencv?Fine,首先我们的弄清楚两个问题:
所以本文我会分开来,讲讲如何使用gcc编译套组(包括你的g++编译器啦)来在Windows上成功编译一个opencv程序并使用vscode来让这个过程变得更加便捷和优雅。
在Windows上安装gcc支持的opencv有两种方法——懒人版和手动编译版,我猜你们应该都喜欢第一种吧。
懒人版原料:
opencv发布的软件包中貌似并没有Windows下使用g++预先编译好的版本,所以我们需要手动编译一把,我知道对于小白来说,编译大型C++项目就是噩梦,我也是,所以我预先编译好了一份(其实我编译了一上午,因为电脑环境变量太杂了,出了很多问题,最后还是请的我的超人同学
编译好的build,champion,我的超人!!!)我将构建完的build扔到gitee上去了,100多MB的样子,链接如下:
我还放了一本opencv的圣经在这个仓库里,自取啦,不用感谢我,因为我也是白嫖的hhh。
然后请按照以下的步骤:
手动编译版如何检验我会后面说
原料:
去拜访一下大慈善家的网站: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
其中:
gcc套组的基本编译指令就不要我多讲了吧,我还是讲一下吧:
$g++ -g-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在不在当前的文件夹下,也可以直接将我们构建好的程序载入内存:
效果就是会读入你放入的一张图片,然后展示啦,当图片窗口得到焦点时(位于所有窗口最上层时),触发任意的键盘事件都会使得窗口退出,这就是最终的效果:
我知道我知道,许多大佬都能用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却无法自动补全,甚至上面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下就好了。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧