如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序

返回目录:OpenCV系列文章目录(持续更新中......)

前一篇:OpenCV4.9.0在windows系统下的安装

后一篇:

警告:

本教程可以包含过时的信息。

我在这里描述的所有内容都将适用于 OpenCV 的C\C++接口。我首先假设您已经阅读并成功完成了 Windows 安装教程。因此,在继续操作之前,请确保您有一个包含 OpenCV 头文件和二进制文件的 OpenCV 目录,并且您已按照此处所述设置环境变量 设置 OpenCV 环境变量并将其添加到系统路径 。

OpenCV_Install_Directory.jpg

我们在 Microsoft Windows 操作系统上分发的 OpenCV 库位于动态链接库 (DLL) 中。它们的优点是,库的所有内容仅在运行时按需加载,并且无数程序可能使用相同的库文件。这意味着,如果您有 10 个应用程序使用 OpenCV 库,则无需为每个应用程序设置一个版本。当然,您需要在要运行应用程序的所有系统上安装 OpenCV 的 dll

另一种方法是使用具有 lib 扩展的静态库。您可以使用我们的源文件来构建这些文件,如在 Windows 中安装教程中所述。当您使用它时,该库将内置在您的 exe 文件中。因此,出于某种原因,用户不可能删除它们。作为一个缺点,您的应用程序会更大,并且在启动期间需要更多时间来加载它。

要使用 OpenCV 构建应用程序,您需要做两件事:

  • 告诉编译器OpenCV库的外观。为此,您可以向其显示头文件。
  • 需要时,告诉链接器从哪里获取OpenCV的函数或数据结构。

    如果使用 lib 系统,则必须设置库文件所在的路径,并指定要在哪个库文件中查找。在生成过程中,链接器将查看这些库,并将所有使用的函数和数据结构的定义和实现添加到可执行文件中。

    如果您使用 DLL 系统,则必须再次指定所有这些,但现在出于不同的原因。这是特定于 Microsoft 操作系统的东西。链接器似乎需要知道在DLL中的哪个位置才能在运行时搜索数据结构或函数。此信息存储在 lib 文件中。然而,它们不是静态库。它们就是所谓的导入库。这就是为什么当您在 Windows 中制作一些 DLL 时,您最终也会得到一些 lib 扩展库。好的部分是在运行时只需要 DLL

若要将所有这些信息传递给 Visual Studio IDE,可以全局执行此操作(以便所有将来的项目都将获得此信息),也可以在本地执行此操作(因此仅针对当前项目)。全局的优点是你只需要做一次;但是,将所有项目都与所有这些信息聚集在一起可能是不可取的。如果是全局的,你如何做取决于你使用的 Microsoft Visual Studio。有 2008 年和以前的版本以及 2010 年的方法。在本教程的全局部分中,我将展示主要区别是什么。

Visual Studio 中项目的基本项是解决方案。一个解决方案可以包含多个项目。项目是应用程序的构建基块。每个项目都会实现一些东西,您将有一个主要项目,您可以在其中将这个项目拼图放在一起。对于许多简单的应用程序(就像许多教程一样),您不需要将应用程序分解为模块。在这些情况下,您的主项目将是唯一现有的项目。现在,通过“文件”(File) –> “新建 (New)–>项目”(Project) 菜单选择,在 Visual Studio 中创建一个新解决方案。选择“Win32 控制台应用程序”作为类型。输入其名称并选择创建它的路径。然后,在即将到来的对话框中,确保创建一个空项目。

NewProjectVisualStudio.jpg

本地方法

每个项目都是与其他项目分开构建的。因此,每个项目都有自己的规则包。在此规则包中存储了 IDE 构建项目所需的所有信息。对于任何应用程序,至少有两种构建模式:发布模式和调试模式。Debug 具有许多功能,因此您可以查找并解决应用程序中更简单的错误。相比之下,Release 是一个优化版本,其目标是使应用程序运行得尽可能快或尽可能小。您可能会发现,这些模式还需要在构建过程中使用不同的规则。因此,每种生成模式都存在不同的规则包。这些规则包在 IDE 中作为项目属性调用,您可以使用“属性管理器”查看和修改它们。可以使用“查看”->“属性页”(对于 Visual Studio 2013 及更高版本,请转到“查看”->“其他窗口”-“>属性管理器”)。展开它,可以看到现有的规则包(称为属性表)。

PropertyPageExample.jpg

这些真正有用的东西是,您可以创建一次规则包,然后可以将其添加到您的新项目中。创建一次,以后重复使用。我们想要创建一个新的属性表,其中包含编译器和链接器需要知道的所有规则。当然,我们需要一个单独的 Debug 和 Release Builds。使用调试启动,如下图所示:

AddNewPropertySheet.jpg

例如,使用OpenCV_Debug名称。然后,通过选择工作表,右键单击 –> 属性。在下文中,我将演示如何在本地设置 OpenCV 规则,因为我发现没有必要使用我不使用它的自定义规则来污染项目。转到 C++ 组的常规条目,然后在 *“附加包含目录”* 下添加 OpenCV 包含的路径。如果没有 *“C/C++”* 组,则应将任何 .c/.cpp 文件添加到项目中。

$(OPENCV_DIR)\..\..\include

PropertySheetOpenCVInclude.jpg

添加第三方库设置时,通常最好使用环境变量背后的强大功能。OpenCV 库的完整位置可能会在每个系统上更改。此外,由于某种原因,您甚至可能最终移动安装目录。如果您在属性表中提供显式路径,则当您将项目进一步传递给具有不同 OpenCV 安装路径的其他人时,您的项目最终将无法正常工作。此外,解决此问题需要手动修改每个显式路径。一个更优雅的解决方案是使用环境变量。在括号内以美元符号开头的任何内容都将在运行时替换为当前环境变量值。这里是我们在上一个教程中已经做的环境变量设置 设置OpenCV环境变量并将其添加到系统路径中 。

接下来转到 Linker –> General,然后在 *“Additional Library Directories”* 下添加 libs 目录:

$(OPENCV_DIR)\lib

PropertySheetOpenCVLib.jpg

然后,您需要指定链接器应在其中查看的库。为此,请转到链接器 –> 输入,并在 *“Additional Dependencies”* 条目下添加要使用的所有模块的名称:

PropertySheetOpenCVLibrariesDebugSmple.jpg

PropertySheetOpenCVLibrariesDebug.jpg

库的名称如下:

opencv_(模块名称)(您使用的库的版本号)d.lib

最新版本的完整列表将包含:

opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_shape300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_ts300d.lib
opencv_video300d.lib
opencv_videoio300d.lib
opencv_videostab300d.lib

或者,您的 OpenCV 下载可能已内置到一个大型 .lib 文件中。通过查看 OpenCV\build\architecture\vc14\lib 进行检查。在这种情况下,对于版本 3.3.0,您只需添加:

opencv_world330.lib

末尾的字母 d 仅表示这些是调试所需的库。现在单击“确定”进行保存,并对“发布规则”部分中的新属性执行相同的操作。请确保省略库名称中的 d 个字母,并使用其上方的保存图标保存属性表。

PropertySheetOpenCVLibrariesRelease.jpg

您可以在项目目录中找到您的属性表。在这一点上,将它们备份到某个特殊的目录中是一个明智的决定,以便将来每当您创建 OpenCV 项目时,它们总是在手边。请注意,对于 Visual Studio 2010,文件扩展名是 props,而对于 2008,文件扩展名是 vsprops

PropertySheetInsideFolder.jpg

下次创建新的 OpenCV 项目时,只需使用“添加现有属性表...”属性管理器中的菜单条目,可轻松添加 OpenCV 构建规则。

PropertyPageAddExisting.jpg

全局方法

如果您发现将属性页添加到每个项目太麻烦,也可以将此规则添加到*“全局属性页”*。但是,这仅适用于其他 include 和 library 目录。要使用的库的名称仍需要手动指定,例如:属性页。

在 Visual Studio 2008 中,您可以在以下目录下找到它:工具 –> 选项 –> 项目和解决方案 –> VC++ 目录。

VCDirectories2008.jpg

在 Visual Studio 2010 中,这已移动到全局属性表,该属性表会自动添加到您创建的每个项目中:

VCDirectories2010.jpg

该过程与本地方法中描述的过程相同。只需使用环境变量 OPENCV_DIR 添加包含目录即可。

如下例子:

现在,要尝试一下,请下载我们的小测试源代码,或从 OpenCV 源代码的示例代码文件夹中获取它。将其添加到您的项目并生成它。以下是其内容:

​#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
if( argc != 2)
{
cout <<" Usage: " << argv[0] << " ImageToLoadAndDisplay" << endl;
return -1;
}
Mat image;
image = imread(argv[1], IMREAD_COLOR); // Read the file
if( image.empty() ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}

​

可以从两个位置启动 Visual Studio 生成。无论是从 IDE(键盘组合:Control-F5)内部,还是导航到构建目录,然后双击启动应用程序。问题是这两者不一样的。从 IDE 启动它时,它的当前工作目录是 projects 目录,否则它是应用程序文件当前所在的文件夹(因此通常是您的构建目录)。此外,如果从 IDE 启动,控制台窗口在完成后不会关闭。它将等待您的击键。

在代码中编写代码、打开和保存命令时,请务必记住这一点。您的资源将相对于您的工作目录进行保存(并在打开!!时查询)。除非您提供完整的显式路径作为 I/O 函数的参数。在上面的代码中,我们打开这个 OpenCV 徽标。在启动应用程序之前,请确保将图像文件放在当前工作目录中。修改代码中的图像文件名,以便在其他图像上也进行尝试。运行它并瞧 á

SuccessVisualStudioWindows.jpg

Visual Studio 的命令行参数

在我们未来的一些教程中,你会看到程序的主要输入法是通过给出运行时参数来实现的。为此,您只需启动一个命令窗口(开始菜单中的 cmd + Enter),导航到可执行文件并使用参数启动它。因此,例如,在我的上部项目中,这将看起来像:

D:
CD OpenCV\MySolutionName\Release
MySolutionName.exe exampleImage.jpg

H在这里,我首先更改了我的驱动器(如果您的项目不在操作系统本地驱动器上),导航到我的项目并使用示例图像参数启动它。虽然在Linux系统下,在Microsoft Windows上摆弄控制台窗口是很常见的,但许多人几乎从未使用它。此外,在测试应用程序时一次又一次地添加相同的参数在某种程度上是一项繁琐的任务。幸运的是,在 Visual Studio 中,有一个菜单可以自动执行所有这些操作:

VisualStudioCommandLineArguments.jpg

此处指定输入的名称,当您从 Visual Studio 环境启动应用程序时,您可以自动传递参数。

参考:1.《How to build applications with OpenCV inside the "Microsoft Visual Studio"》Bernát Gábor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/463019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wsl ubuntu 安装的正确方式

目录 wsl ubuntu 安装的正确方式&#xff1a; 将wsl2设置为默认版本&#xff1a; 1、打开powershell 2、设置wsl的版本为2 ​编辑 3、更新wsl程序 4、强制关闭子系统 5、查看wsl支持的列表 6、安装指定版本的系统 wsl ubuntu 安装的正确方式&#xff1a; 此时&#xff0c…

Leetcode31. 删除无效的括号

心路历程&#xff1a; 一开始看到有点懵&#xff0c;后来发现有点像按照一定规则穷举所有可能情况&#xff0c;想到了排列组合问题&#xff0c;再结合问题长度不固定&#xff0c;无法用已知个for循环表示&#xff0c;从而想到了回溯。这个题相当于需要在一定规则下枚举。 按照…

刚刚离乳的幼猫该如何选择猫粮品牌?

亲爱的猫友们&#xff0c;当你家的幼猫刚刚离乳&#xff0c;准备踏入猫粮的世界时&#xff0c;如何选择一款合适的猫粮品牌确实是个让人头疼的问题。&#x1f43e; 别担心&#xff0c;今天我就来为大家推荐一款值得信赖的幼猫粮——福派斯幼猫粮。 1️⃣ 考虑幼猫的营养需求 幼…

SQLiteC/C++接口详细介绍之sqlite3类(十三)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十二&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09;&#xff08;未发表&#xff09; 40.sqlite3…

如何在webapp中于动发布一个应用

目录 第一步&#xff1a;在webapp文件夹内自定义文件夹第二步&#xff1a;生成一个文本&#xff0c;并把后缀改为 .html第三步&#xff1a;进入bin文件夹打开服务第四步&#xff1a;打开方式选择java第六步&#xff1a;输入你想输出的东西第七步&#xff1a;双击运行即可 第一步…

网络爬虫丨基于scrapy+mysql爬取博客信息

文章目录 写在前面实验描述实验框架实验需求 实验内容1.安装依赖库2.创建Scrapy项目3.配置系统设置4.配置管道文件5.连接数据库6.分析要爬取的内容7.编写爬虫文件 运行结果写在后面 写在前面 本期内容&#xff1a;基于scrapymysql爬取博客信息并保存到数据库中 实验需求 ana…

线程有哪几种状态(附图)以及线程状态的变化

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 线程的几种状态 线程的状态包括新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、等待状态(Waiting)、超时等待状态…

1、FreeRTOS之任务管理

void vTask1( void *pvParameters ) { const char *pcTaskName "Task 1 is running\r\n"; volatile unsigned long ul; /* 和大多数任务一样&#xff0c;该任务处于一个死循环中。 */ for( ;; ) { /* Print out the name of this task. */ vPrintString( pcTaskNam…

腾讯云图形验证码的PHP示例

需要准备的 1.API密钥 SecretId 及 SecretKey 两部分&#xff0c; SecretId 用于标识 API 调用者的身份&#xff0c; SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥。 前往API密钥管理页面&#xff0c;即可进行获取 https://console.cloud.tencent.com/cam/ca…

切面条-蓝桥杯?-Lua 中文代码解题第1题

切面条-蓝桥杯&#xff1f;-Lua 中文代码解题第1题 一根高筋拉面&#xff0c;中间切一刀&#xff0c;可以得到2根面条。 如果先对折1次&#xff0c;中间切一刀&#xff0c;可以得到3根面条。 如果连续对折2次&#xff0c;中间切一刀&#xff0c;可以得到5根面条。 那么&#xf…

【二】【单片机】有关独立按键的实验

自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中&#xff0c;直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…

web高可用集群(nginx负载均衡+keepalived实现调度器HA)

web高可用集群(nginx负载均衡keepalived实现调度器HA&#xff09; 主机IP地址代理服务器192.168.88.66代理服务器192.168.88.38Real server192.168.88.10Real server192.168.88.20 配置俩台Real server [rootweb1 ~]# vim /etc/yum.repos.d/nginx.repo [rootweb1 ~]# cat /e…

图解缓存淘汰算法 LRU、LFU | 最近最少使用、最不经常使用算法 | go语言实现

写在前面 无论是什么系统&#xff0c;在研发的过程中不可避免的会使用到缓存&#xff0c;而缓存一般来说我们不会永久存储&#xff0c;但是缓存的内容是有限的&#xff0c;那么我们如何在有限的内存空间中&#xff0c;尽可能的保留有效的缓存信息呢&#xff1f; 那么我们就可以…

AI毕业论文降重GPTS,避免AI检测,高效完成论文

视频演示 AI毕业论文降重GPTS&#xff0c;避免AI检测&#xff0c;高效完成论文&#xff01; 开发目的 “毕业论文降重”GPTS应用&#xff0c;作用为&#xff1a;重新表述学术论文&#xff0c;降低相似性评分&#xff0c;避免AI检测。 使用地址 地址&#xff1a;毕业论文降重…

浏览器如何进行静态资源缓存?—— 强缓存 协商缓存

在平时使用浏览器排查问题的过程中&#xff0c;我们有时会看到浏览器网络请求中出现304状态码&#xff0c;那么是什么情况下出现304呢&#xff1f;下面是关于这一现象的解释&#xff1a; 浏览器如何进行静态资源缓存&#xff1f;—— 强缓存 & 协商缓存 状态码 304浏览器如…

springboot基于spring boot的在线答题微信小程序

摘 要 在线答题微信小程序是考试中重要的一环&#xff0c;在线答题是学生获取任务信息的主要渠道。为了方便学生能够在网站上查看任务信息、考试&#xff0c;于是开发了基于 springboot框架设计与实现了一款简洁、轻便的在线答题微信小程序。本微信小程序解决了在线答题事务中的…

linux源配置:ubuntu、centos

1、ubuntu源配置 1&#xff09;先查电脑版本型号: lsb_release -c2&#xff09;再编辑源更新&#xff0c;源要与上面型号对应 参考&#xff1a;https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…

HTTPS(超文本传输安全协议)工作过程

一、简述HTTPS HTTPS超文本传输协议&#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&#x…

【JavaScript】JavaScript 运算符 ④ ( 逻辑运算符 | 逻辑与运算符 | 逻辑或运算符 || | 逻辑非运算符 ! )

文章目录 一、JavaScript 逻辑运算符1、逻辑运算符 概念2、逻辑与运算符 &&3、逻辑或运算符 ||4、逻辑非运算符 !5、完整代码示例 一、JavaScript 逻辑运算符 1、逻辑运算符 概念 JavaScript 中的 逻辑运算符 的作用是 对 布尔值 进行运算 , 运算完成 后 的 返回值 也是…

数据可视化-ECharts Html项目实战(1)

在之前的文章中&#xff0c;我们学习了如何安装Visual Studio Code并下载插件&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 安装 Visual Studio…