我已经在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?
答案 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上运行代码的解决方案:
如上所述,如果您在不兼容的版本之间弹出,这可能会引起一些严重的悲痛,但对于支持的这些版本和功能,这可能对某些人有用。使用此技术设置opencv版本一次,并使您的代码通过
自动链接到所需的版本我的代码最终如此:
#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)
,但由于属性页面会自动翻译$(宏),我们可以在那里得到环境变量。