自动包含不同版本的OpenCV库

时间:2012-04-05 21:18:02

标签: c++ visual-studio opencv

我已经在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库可用,然后将相应的版本字符串滑入pragma?

2 个答案:

答案 0 :(得分: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上有不同的签名。

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

答案 1 :(得分:2)

通过合并以下文章,我找到了在不同版本的OPENCV上运行代码的解决方案:

  1. How to make a string out of macros
  2. Concatenating strings in macros
  3. Pragma statements in #definessupport for VS2008 here on MSDN
  4. 奖金:How to have global settings defined in a solution
  5. 如上所述,如果您在不兼容的版本之间弹出,这可能会引起一些严重的悲痛,但对于支持的这些版本和功能,这可能对某些人有用。使用此技术设置opencv版本一次,并使您的代码通过

    自动链接到所需的版本
    1. 在源代码中的一个地方定义OPENCV_VERSION

    2. 在属性表中定义
    3. 在系统环境变量中定义它。
    4. 我的代码最终如此:

      #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-&gt; Properties-&gt; C / C ++ - &gt;预处理器并将预处理器定义设置为OPENCV_VERSION = 220。 您可以在整个解决方案的共享属性表中执行相同的操作。

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