文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

我在这里描述的一切将适用于OpenCV的C、c++接口。我假设你已经阅读并成功的完成 Installation in Windows 的教程内容. 因此, 在进行下一步之前 确保你的openCV目录下包含 OpenCV 头文件额二进制文件 并且你已经按照 described here配置好了环境变量。

You should have a folder looking like this.

在微软Windows操作系统上被我们分配的OpenCV 库处于动态链接库中(DLL). 这样的好处是使得所有库的内容只在运行时按要求载入, 并且无数的程序可能使用相同的库文件. 这意味着假如你有十个使用openCV库的应用程序, 没有必要为每一个配置一个版本. 当然你需要openCV 的dll放在所有你所要运行程序的系统上 。

第 1 段(可获 2 积分)

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

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

  • 告诉编译器OpenCV库长什么样子。你可以通过头文件告诉它。

  • 告诉链接器从何处获取OpenCV的函数或数据结构(当需要它们时)。

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

    如果你使用DLL系统,你必须再次指定所有内容,但这次的原因不同。这是Microsoft操作系统特有的东西。看起来链接器需要知道在DLL运行时去哪搜索数据结构或函数。这些信息存储在lib文件中。然而,它们不是静态库。它们是所谓的导入库。这就是为什么当你在Windows中创建一些DLL时,你也将最终得到一些lib扩展库。好处是在运行时只需要DLL文件。

第 2 段(可获 2 积分)

在Visual Studio IDE中要传递所有的信息,您既可以在全局配置(所有未来的项目都将获得这些信息)也可以在本地配置(所以只适用于当前项目)。 全局的优点是你只需要做一次; 然而,你可能不希望你所有的项目都包含这些信息。 在全局情况下如何做到这点取决于您使用的Microsoft Visual Studio。 有一个2008年和以前的版本和2010年的做法。 在本教程的全局部分中,我将展示他们的主要区别。

第 3 段(可获 2 积分)

Visual Studio中项目的基础称为一个解决方案。 解决方案可能包含多个项目。 项目是应用程序的构建块。 每个项目都将实现一些东西,你将有一个主要的项目,你可以在这个项目中将其他项目组织起来。 在许多简单的应用程序(如许多教程那样)的情况下,您不需要将应用程序分解为模块。 在这些情况下,您的主项目将是唯一存在的项目。 现在在Visual studio中通过选择菜单栏文件‣新建‣项目(File ‣ New ‣ Project)创建一个新的解决方案。 选择Win32控制台应用程序(Win32 Console Application)作为类型。 输入其名称并选择要创建它的路径。 然后在即将到来的对话框中确保您创建一个空项目。

第 4 段(可获 2 积分)

Which options to select

本地(local)方法

每个项目都是与其他项目分开构建的。 由于每个项目都有自己的规则包。 在这个规则包中存储IDE需要知道的所有构建项目的信息。 对于任何应用程序,至少有两种构建模式:发行版(Release)和调试版(Debug)。 调试版(Debug)有许多功能,所以你可以更容易的找到和解决您的应用程序中的错误。 相比之下,发行版(Release)是一个优化的版本,其目标是使应用程序尽可能快或尽可能小地运行。 您可能会认为这些模式也需要在构建过程中使用不同的规则。 因此,每种构建模式都有不同的规则包。 这些规则包在IDE中作为项目属性(project properties )调用,您可以使用属性管理器(Property Manger)查看和修改它们。 您可以使用View‣属性页(View ‣ Property)。 展开它,您可以看到现有的规则包(称为属性表(Proporty Sheets))。

第 5 段(可获 2 积分)

这些真正有用的东西是,你可以一次创建一个规则包并且可以稍后将它添加到你的新项目里。 一次创建并多次使用。 我们想创建一个新的属性表(Property Sheet),它将包含编译器和链接器需要知道的所有规则。 当然,我们需要针对Debug和Release构建分别创建。 使用Debug启动,如下图所示:

使用例如 OpenCV_Debug的名称。 然后通过选择表单右键单击‣属性(Right Click ‣ Properties.)。 在下面我将展示在本地设置OpenCV规则,因为我发现不必使用那些我没有用到的自定义规则来污染项目。 转到C ++组常规条目并在“其他包含目录(Additional Include Directories)”下添加您的OpenCV包含的路径。 如果没有“C/C++”组,应该将任意.c / .cpp文件添加到项目中。

第 6 段(可获 2 积分)
$(OPENCV_DIR)\..\..\include

当添加第三方库设置时,通常使用环境变量是个好主意。 OpenCV库的完整位置可能在每个系统上不同。 此外,由于某些原因,您甚至可能会移动安装目录。 如果你在你的属性表中给出明确的路径,当你再把它传递给有不同的OpenCV安装路径的人时,你的项目将不能工作。 此外,修复这个问题将需要手动修改每个明确的路径。 更优雅的解决方案是使用环境变量。 任何你放在一个以美元符号开头的括号中的东西将在运行时被替换为当前的环境变量值。 这里来用环境变量设置,我们在前面的教程中已经做了。

第 7 段(可获 2 积分)

接下来转到 Linker ‣ General 然后在 “Additional Library Directories” 下增加 libs 目录:

$(OPENCV_DIR)\lib

你需要指定 Linker 查找库文件的目录。进入 Linker ‣ Input 然后在 “Additional Dependencies” 入口增加你想使用的所有模块的名称:

库名称如下所示:

opencv_(The Name of the module)(The version Number of the library you use)d.lib

下面是最新版本的完整库文件列表:

opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_ml249d.lib
opencv_nonfree249d.lib
opencv_objdetect249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_videostab249d.lib
第 8 段(可获 2 积分)

最后的字母d 表示这些是调试所需的库。 现在点击确定保存并在发布规则部分中使用新的属性。 确保从库名称中省略d字母,并使用上面的保存图标保存属性表。

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

第 9 段(可获 2 积分)

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

全局方法

如果您发现要将属性页添加到每个项目中很麻烦的话,您还可以将此规则添加到“全局属性页(global property page)”。 但是,这仅适用于额外的include和library目录。 要使用的库的名称仍需要手动指定,例如使用:属性页(a Property page)。

在Visual Studio 2008中,您可以在以下位置找到它:工具‣选项‣项目(Tools ‣ Options ‣ Projects)和解决方案‣VC ++(Solutions ‣ VC++)目录。

第 10 段(可获 2 积分)

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

该过程与在局部方法的情况下描述的相同。 只需使用环境变量OPENCV_DIR添加包含目录。

测试!

现在让我们试试从源代码下载的测试程序或从OpenCV sources文件夹下的示例代码文件夹中获取它。 将它添加到您的项目并构建它。 这里是它的内容:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
    if( argc != 2)
    {
     cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
     return -1;
    }

    Mat image;
    image = imread(argv[1], IMREAD_COLOR); // Read the file

    if(! image.data ) // 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启动的情况下,控制台窗口将不会在完成后关闭。 它会等待你按键。

第 11 段(可获 2 积分)

记住当你在代码里面执行打开和保存命令时,这一点很重要。 你的资源将在当前工作目录中保存(并查询!!!)。 除非您为I / O函数提供完整的显式路径作为参数。 在上面的代码中,我们打开OpenCV标志图片。 在启动应用程序之前,请确保将图片文件放在当前工作目录中。 修改代码中的图像文件名,并尝试使用其他图像。 运行它并瞧瞧看:

使用Visual Studio的命令行参数

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

第 12 段(可获 2 积分)
D:
CD OpenCV\MySolutionName\Release
MySolutionName.exe exampleImage.jpg

在这里我首先更改了我的驱动(如果你的项目不在操作系统本地驱动器中),导航到我的项目,并使用一个示例图像参数启动它。 虽然在Linux系统下使用控制台很常见,但在微软Windows上很多人几乎从来没有使用过。 此外,在测试应用程序时,一次又一次添加相同的参数,有时是一件麻烦的任务。 幸运的是,在Visual Studio中有一个菜单可以自动化处理:

在这里指定输入的名称,当您从Visual Studio环境启动应用程序时,参数将被自动传递。 在下一个介绍教程中,您将看到上面源代码的深入解释:加载并显示图像

第 13 段(可获 2 积分)

文章评论