【OpenCV学习】之如何在“ Microsoft Visual Studio”中使用OpenCV构建应用程序

前言

该文章翻译自官方文档,英语水平有限,望海涵。

原文链接:https://docs.opencv.org/master/dd/d6e/tutorial_windows_visual_studio_opencv.html

 

正文

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

                                                             OpenCV_Install_Directory.jpg

 

在Microsoft Windows操作系统上发布的OpenCV库位于动态链接库(DLL)中。 具有的优点是,库的所有内容仅在运行时按需加载,并且无数程序可以使用相同的库文件。 这意味着如果您有十个使用OpenCV库的应用程序,则每个应用程序都不需要一个版本。 当然,您需要在要运行应用程序的所有系统上拥有OpenCV的dll。

另一种方法是使用具有lib扩展名的静态库。 您可以按照Windows安装指南中的说明使用源文件来构建它们。 使用此库时,该库将加载到您的exe文件中。 因此,由于某种原因,用户没有机会删除它们。 缺点就是您的应用程序将变得更大,并且在启动过程中将花费更多的时间来加载它。

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

  • 告诉编译器OpenCV库。 您可以通过使用头文件来做到这一点。
  • 告诉链接器何时何地需要OpenCV的功能或数据结构。
  • 如果您使用lib,则必须设置库文件所在的路径并指定要在其中查找的文件之一。 在构建过程中,链接器将寻找这些库并将所有已使用函数和数据结构的定义和实现添加到可执行文件中。

    如果您使用DLL系统,则必须指定所有这一切,但是现在还有其他原因。 这是Microsoft OS专用的东西。 似乎链接器需要知道DLL运行时在何处搜索数据结构或函数。 此信息存储在lib文件中。 但是,它们不是静态库。 它们被称为导入库。 这就是为什么当您在Windows中制作一些DLL时,您还会得到一些lib扩展库的原因。 好的是在运行时仅需要DLL。

要将所有这些信息传递给Visual Studio IDE,您可以在全局(这样所有将来的项目都将获得此信息)或在本地(这样才对您当前的项目)进行。 全局的优点是您只需要执行一次。 但是,可能不希望一直将所有这些信息都包含在您的所有项目中。 如果是全局变量,您的操作取决于您使用的Microsoft Visual Studio。 有2008年和以前的版本以及2010年的方式。 在本教程的全局部分中,我将说明主要区别是什么。

Visual Studio中项目的基本项是解决方案。 一个解决方案可能包含多个项目。 项目是应用程序的构建模块。 每个项目都会实现一些事情,您会有一个整合所有问题的主项目。 如果有许多简单的应用程序(就像许多教程一样),则无需将应用程序分解为模块。 在这些情况下,您的主要项目将是现有唯一的项目。 现在,通过选择文件–>新建–>项目菜单,在Visual Studio中创建一个新的解决方案。 选择``Win32控制台应用程序''作为类型。 输入名称,然后选择创建路径。 然后确保在接下来的对话框中创建一个空项目。

                                                 NewProjectVisualStudio.jpg

本地方法

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

                                                                  PropertyPageExample.jpg

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

                                                                  AddNewPropertySheet.jpg

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

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

                                        PropertySheetOpenCVInclude.jpg

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

接下来转到链接器–>常规,然后在*“其他库目录” *下添加libs目录:

$(OPENCV_DIR)\lib

                                     PropertySheetOpenCVLib.jpg

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

                                      PropertySheetOpenCVLibrariesDebug.jpg 

这些库的名称如下:

opencv_(The Name of the module)(The version Number of the library you use)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表示这些是debug调试所需的库。 现在,单击“确定”保存并使用“发布规则”部分中的新属性进行相同操作。 确保忽略库名称中的d字母,并使用上方的保存图标保存属性表。

                                                PropertySheetOpenCVLibrariesRelease.jpg

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

                                                           PropertySheetInsideFolder.jpg

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

                                                            PropertyPageAddExisting.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>
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启动时,它的当前工作目录是项目目录,否则是应用程序文件当前所在的文件夹(通常是您的构建目录)。 此外,如果从IDE启动,则控制台窗口一旦完成将不会关闭。 它将等待您的按键。

当您在代码内部打开和保存命令时进行编码时,记住这一点很重要。 您的资源将相对于您的工作目录保存(并在打开时查询!!!)。 除非您给出完整的显式路径作为I / O功能的参数,否则这是必须的。 在上面的代码中,我们打开此OpenCV徽标。 在启动应用程序之前,请确保将映像文件放置在当前工作目录中。 修改代码中的图像文件名,以在其他图像上进行尝试。 运行它并掩饰á:

                                                      SuccessVisualStudioWindows.jpg

Visual Studio的命令行参数

在其他一些教程中,您将看到程序的主要输入法是通过提供运行时参数。 为此,您可以仅启动命令窗口(在开始菜单中使用cmd + Enter),导航到可执行文件并使用参数启动它。 因此,例如在我的上层项目中,它看起来像:

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章