如何在“Microsoft Visual Studio”中使用OpenCV构建应用程序

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

OpenCV_Install_Directory.jpg

我们在 Microsoft Windows 操作系统上分发的 OpenCV 库位于动态链接库 (DLL) 中。这些的优点是,库的所有内容仅在运行时按需加载,并且无数程序可能使用相同的库文件。这意味着,如果您有十个应用程序使用 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 中项目的基本项是解决方案。一个解决方案可以包含多个项目。项目是应用程序的构建基块。每个项目都会实现一些东西,您将有一个主项目,您可以在其中将这个项目拼图放在一起。对于许多简单的应用程序(就像许多教程一样),您不需要将应用程序分解为模块。在这些情况下,您的主项目将是唯一现有的项目。现在,通过“文件”->“新建”-“项目”菜单选择,在 Visual Studio 中创建新的解决方案>。选择“Win32 控制台应用程序”作为类型。输入其名称,然后选择创建它的路径。然后,在即将到来的对话框中,确保创建一个空项目。

新项目可视化工作室.jpg

本地方法

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

属性页面示例.jpg

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

添加新属性表.jpg

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

$(OPENCV_DIR)\..\..\包括

PropertySheetOpenCVInclude.jpg

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

接下来转到链接器 –> General,并在 *“Additional Library Directories”* 下添加 libs 目录:

$(OPENCV_DIR)\lib

属性表OpenCVLib.jpg

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

属性表OpenCVLibrariesDebugSmple.jpg

属性表OpenCVLibrariesDebug.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

属性表内部文件夹.jpg

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

属性页面添加现有.jpg

全局方法

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

在 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>
使用命名空间 CV;
使用命名空间 std;
int main( int argc, char** argv )
{
if( argc != 2)
{
cout <<“ 用法:” << argv[0] << “ImageToLoadAndDisplay” << endl;
返回 -1;
}
垫子图像;
图像 = imread(argv[1], IMREAD_COLOR);读取文件
if( 图像。empty() ) // 检查无效输入
{
cout << “无法打开或找到图像” << std::endl ;
返回 -1;
}
namedWindow( “显示窗口”, WINDOW_AUTOSIZE );创建一个用于显示的窗口。
imshow( “显示窗口”, 图像 );在里面展示我们的图像。
waitKey(0);等待窗口中的击键
返回 0;
}
​

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

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

成功可视化工作室Windows.jpg

Visual Studio 的命令行参数

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

D:
CD OpenCV\MySolutionName\Release
MySolutionName.exe 示例Image.jpg

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

可视化工作室命令行参数.jpg

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

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

相关文章

多智能体强化学习(概念知识,不涉及具体算法)

目录 一、前置知识1.factored value function2.partially observable MDP (POMDP) problem.2.2 Decentralized-POMDP problem2.3 networked decentralized partially observable Markov decision processes (ND-POMDP) problem2.4 上述两种算法的区别 3. Mean Field Multi-Agen…

深信服超融合HCI版本升级,6.0.0R5升级至6.8.0R2

超融合升级&#xff0c;需要满足以下条件及前期准备&#xff1a; 确认HCI的升级序列号有效升级时长大概在一个半小时&#xff0c;安全起见&#xff0c;需预留至少三至四小时窗口期升级前&#xff0c;需要将所有虚拟机关机&#xff0c;涉及到业务无法访问&#xff0c;需提前通知…

redis中的string相关的部分命令

redis命令手册 redis中文官网查看文档 挨个进行输出调试 Redis Setnx 命令 Redis Getrange 命令 Redis Mset 命令 redis 127.0.0.1:6379> MSET key1 "Hello" key2 "World" OK redis 127.0.0.1:6379> GET key1 "Hello" redis 127.0.0.1:…

datavrap-各种各样的条形图(含详细操作步骤)

静态条形图&#xff1a;正确设置数据即可&#xff0c;导出的图形不会随着时间变化 最普通的静态条形图 黑色系风格的静态条形图 动态条形图&#xff1a;导出的图形会随着时间变化 普通的动态条形图 带数字滚动效果的动态条形图 简单的Top排行榜动态条形图 格式更丰富的Top排行榜…

牛客周赛 Round 28 解题报告 | 珂学家 | 组合数学 + 离散化树状数组

前言 整体评价 还是E稍微有点意思&#xff0c;新周赛好像比预期要简单一些, _. 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红的新周赛 思路: 模拟 #include <bits/stdc.h>using namespace std;int main() {int res 0;for (int i 0; i < 6; i…

【算法练习】leetcode算法题合集之数组和哈希表篇

重建数组&#xff08;高频&#xff09; LeetCode283.移动零 LeetCode283.移动零 双指针&#xff0c;记录已经处理好的序列的尾部 class Solution {public void moveZeroes(int[] nums) {int k 0;for (int i 0; i < nums.length; i) {if (nums[i] ! 0) {swap(nums, i, k)…

【前后端的那些事】开源!前后端环境搭建+树形结构表格实现

文章目录 1. 前后端项目环境搭建2. table-tree2.1 后端准备2.2 前端准备 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&#xff0c;录视频把这些内容记录下。但这些功能太零碎&#xff0c;如果为每个功能都单独搭建一个项目&#xff0…

Python之Matplotlib绘图调节清晰度

Python之Matplotlib绘图调节清晰度 文章目录 Python之Matplotlib绘图调节清晰度引言解决方案dpi是什么&#xff1f;效果展示总结 引言 使用python中的matplotlib.pyplot绘图的时候&#xff0c;如果将图片显示出来&#xff0c;或者另存为图片&#xff0c;常常会出现清晰度不够的…

前端js写数据结构与算法

1、什么是数据结构与算法 数据结构&#xff1a;是指数据对象中数据元素之间的相互关系。包括集合结构、线性结构、树形结构、图形结构。 算法&#xff1a;解决问题的思路。 2、时间复杂度 1.是什么? 执行当前算法所“花费的时间” 2.干什么? 在写代码的过程中&#xf…

网工内推 | 信息安全主管,CISP/CISSP认证优先,最高25K

01 武汉华康世纪医疗股份有限公司 招聘岗位&#xff1a;网络安全主管 职责描述&#xff1a; 1、推进公司信息/网络安全管理体系规划、建设、持续改进&#xff0c;促进信息安全管理的推行落地,保障网络、系统与数据安全&#xff1b; 2、维护管理信息/网络管理软件&#xff0c;设…

CSP网络结构实战 - 降低计算量的特征融合方式

CSP网络结构实战 - 降低计算量的特征融合方式 CSP网络结构实战 - 降低计算量的特征融合方式0. 引言1. CSP网络结构简介1.1 核心思想1.2 解决的问题 2. 实验验证2.1 CSP网络模型构建2.2 数据读取与预处理2.3 模型训练与验证 3. 对比实验4. 结果与总结 CSP网络结构实战 - 降低计算…

RT-DETR算法优化改进:多层次特征融合(SDI)结合PConv、DualConv、GSConv,实现二次创新 | UNet v2最新论文

💡💡💡本文独家改进:多层次特征融合(SDI)高效结合DualConv、PConv、GSConv等实现二次创新 1)替代原始的Concat; RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-DETR 🚀🚀🚀引入前沿顶会创新(CVPR…

从零开始做题:逆向wdb_2018_2nd_easyfmt

1.题目信息 2.解题分析 格式化字符串漏洞 如何确定偏移 Do you know repeater? 输入AAAA.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p. 输出AAAA.0xffffd658.0x64.0xf7ffdc08.0xf7ffcd00.0xffffd77c.0x41414141.0x2e70252e.0x252e7025.0x70252e70.0x2e70252e.0x252e7025.0x70252…

【数据结构】排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f38f;排序的定义 &#x1f38f;排序的稳定性 &#x1f4cc;稳定性的定义 &#x1f4cc;稳定性的意义 &#x1f38f;内排序与外排序 &#x1f38f;八大内排…

Linux环境基础开发工具的使用(上)

文章目录 Linux 软件包管理器 yum什么是软件包关于rzsz查看软件包安装软件卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行模式各命令汇总 配置vim Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程…

Vue实战:两种方式创建Vue项目

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;安装Vue CLI脚手架1、从Node.js官网下载LTS版本2、安装Node.js到指定目录3、配置Node.js环境变量4、查看node版本5、查看npm版本6、安装Vue Cli脚手架7、查看Vue Cli版本 &#xff08;二&#xff09;命令行方式构建…

Git与VScode联合使用详解

目录 Git与VScode联合使用 方式一 1. 用vscode打开文件夹&#xff0c;如图点击初始化仓库&#xff0c;把此仓库初始为git仓库。 2. 提交文件到本地仓库 3. vscode与github账号绑定 4. 在github中建立远程仓库 5. 本地仓库与远程仓库绑定 方式二 1. 在github上建立远程仓…

魅族MX4pro系统升级、降级

网上的教程都是按住开机键音量上或者下键&#xff0c;但是我按了没用&#xff0c;还是直接点击压缩包管用。 下载系统 官网地址&#xff08;所有手机固件&#xff09;&#xff1a;https://flyme.cn/firmware.html 官方魅族mx4Pro系统&#xff1a;https://flyme.cn/firmwarelis…

通过本质看现象:关于Integer受内部初始化赋值范围限制而出现的有趣现象

文/朱季谦 这是我很多年前的第一篇技术博客&#xff0c;当时作为一名技术小菜鸟&#xff0c;总体而言显得很拙见&#xff0c;但也算是成长路上的一个小脚印&#xff0c;希望能在以后的日子里&#xff0c;可以对JAVA技术有一个更加深入的思考与认识。 前几天我在逛论坛的时候&a…

《C++大学教程》4.14信用额度问题

题目&#xff1a; #include <iostream> #include <iomanip> using namespace std;int main() {unsigned int account;double beginning_balance, total_charges, total_credits, credit_limit;cout << "Enter account numbeu(or -1 to qiut):";cin…