1

我已经在 Windows 7 上的 Visual Studio 2008 上自动包含我的 c++ 代码的 opencv 库文件,代码如下:

#ifndef NDEBUG
#pragma comment(lib, "opencv_core231d.lib")
#pragma comment(lib, "opencv_highgui231d.lib")
#pragma comment(lib, "opencv_imgproc231d.lib")
#else
#pragma comment(lib, "opencv_core231.lib")
#pragma comment(lib, "opencv_highgui231.lib")
#pragma comment(lib, "opencv_imgproc231.lib")
#endif 

但是当系统安装了不同版本的 opencv 库时我遇到了麻烦,因为 .lib 文件的文件名中有版本(在本例中为 2.31)。有没有一种好方法可以自动或接近自动检测可用的 opencv 库版本,然后将适当的版本字符串滑入编译指示?

4

2 回答 2

2

不同的 OpenCV 版本之间有微小的变化——不多,但足以在您从 2.0 更改为 2.2 或从 2.2 更改为 2.3.1 时使您的应用程序崩溃。此外,beta 2.4 版本与以前的版本相比有足够的变化。

所以最好是使用 OpenCV 版本测试您的应用程序,并仅使用这些 dll 交付它。

一个小例子:

Mat a(3,3,CV_8UC3);

a.setTo( Scalar(10) ); // in 2.3.1 will set all channels to 10,
// in 2.2 will only set first channel. 

相应的 2.2 调用将是

a.setTo(Scalar::all(10));

或者

a = 0; // runs fine on 2.3.1. Equivalent to setTo().
// Does not compile on earlier versions

另一个例子是cv::drawPoly(),它在 2.2 和 2.3.1 上有不同的签名。

鉴于这些更改没有得到很好的记录,因此错误地错过其中一个的机会非常高。

于 2012-04-06T05:39:51.507 回答
2

通过合并以下文章,我制定了在各种版本的 OPENCV 上运行代码的解决方案:

  1. 如何用宏创建字符串
  2. 连接宏中的字符串
  3. #defines 中的 Pragma 语句支持 MSDN 上的 VS2008
  4. 奖励:如何在解决方案中定义全局设置

如前所述,如果您在不兼容的版本之间弹出,这可能会导致一些严重的问题,但对于那些支持的版本和功能,这可能对某些人有用。使用此技术设置一次 opencv 版本,并让您的代码通过以下任一方式自动链接到所需版本

  1. 在源代码的一处定义 OPENCV_VERSION

  2. 在属性表中定义它
  3. 在系统环境变量中定义它。

我的代码最终是这样的:

#include <iostream>

// #define OPENCV_VERSION $(OPENCV_VERSION)
// #define OPENCV_VERSION 220

#define QUOTE(name) #name
#define STR(macro) QUOTE(macro) 

#define LINK_TO_OPENCV(libname) __pragma(comment(lib, "opencv_" #libname STR(OPENCV_VERSION)))
#define LINK_TO_OPENCV_DEBUG(libname) __pragma(comment(lib, "opencv_" #libname STR(OPENCV_VERSION) "d"))

#ifndef NDEBUG
LINK_TO_OPENCV_DEBUG("core")
LINK_TO_OPENCV_DEBUG("highgui")
LINK_TO_OPENCV_DEBUG("imgproc")
#else
LINK_TO_OPENCV("core")
LINK_TO_OPENCV("highgui")
LINK_TO_OPENCV("imgproc")
#endif 


int main()
{
    std::cout << STR(LINK_TO_OPENCV("core")) << "\n";
    return 0;
}

现在在任何你喜欢的地方设置 OPENCV_VERSION。例如,您可以让每个人都包含一个头文件,其中包含以下行:

#define OPENCV_VERSION 220

或者您可以转到 Project->Properties->C/C++->Preprocessor 并将 Preprocessor Definitions 设置为 OPENCV_VERSION=220。或者,您可以在整个解决方案的共享属性表中执行相同的操作。

或者,这很重要,您可以使用此技术在 Windows 本身中定义一个名为 OPENCV_VERSION_ENV 的全局环境变量,并将其值设置为版本代码(例如 220)。然后您可以将预处理器定义设置为OPENCV_VERSION=$(OPENCV_VERSION_ENV),并将环境变量引入链接命令。你不能这样做,#define OPEN_VERSION $(OPENCV_VERSION_ENV)但由于属性页会自动翻译 $(macros) 我们可以在那里获取环境变量。

于 2013-02-20T07:07:09.237 回答