如何在“Microsoft Visual Studio”中使用 OpenCV 构建应用程序
我在此描述的所有内容都将适用于 OpenCV 的 C/C++接口。我首先假设您已经阅读并成功完成了 Windows 安装教程。因此,在继续进行之前,请确保您有一个 OpenCV 目录,其中包含 OpenCV 头文件和二进制文件,并且您已经按照这里描述的方式设置了环境变量,即设置 OpenCV 环境变量并将其添加到系统路径中。
我们在 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 控制台应用程序作为类型。输入其名称并选择创建它的路径。然后在即将出现的对话框中,确保创建一个空项目。
<em>全局</em>方法
如果您觉得为每个项目都添加属性页太麻烦,您还可以将这些规则添加到一个“全局属性页”中。但是,这仅适用于附加的包含目录和库目录。您仍然需要手动指定要使用的库的名称,例如通过使用属性页。
在 Visual Studio 2008 中,您可以在以下位置找到:工具 -> 选项 -> 项目和解决方案 -> VC++ 目录。
在 Visual Studio 2010 中,这已被移动到一个全局属性表中,该表会自动添加到您创建的每个项目中:
过程与本地方法的描述相同。只需使用环境变量 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 徽标。在启动应用程序之前,请确保将图像文件放在当前工作目录中。修改代码中的图像文件名,也可以在其他图像上进行尝试。