OpenCV和PCL冲突?

3

我正在使用OpenCV 2.4.2和Point Cloud Library 1.6.0。

我的程序运行良好,直到我添加了以下代码行...

#include <pcl/segmentation/segment_differences.h>

这会在编译时导致错误。我遇到了...
Error   93  error C2872: 'flann' : ambiguous symbol C:\Program Files (x86)\PCL 1.6.0\include\pcl-1.6\pcl\kdtree\kdtree_flann.h  424
Error   94  error C2872: 'flann' : ambiguous symbol C:\Program Files (x86)\PCL 1.6.0\include\pcl-1.6\pcl\kdtree\kdtree_flann.h  425
Error   95  error C2872: 'flann' : ambiguous symbol C:\Program Files (x86)\PCL 1.6.0\include\pcl-1.6\pcl\kdtree\kdtree_flann.h  427
Error   96  error C2872: 'flann' : ambiguous symbol C:\Program Files (x86)\PCL 1.6.0\include\pcl-1.6\pcl\kdtree\kdtree_flann.h  514
Error   97  error C2872: 'flann' : ambiguous symbol C:\Program Files (x86)\PCL 1.6.0\include\pcl-1.6\pcl\kdtree\kdtree_flann.h  520

C:\Program Files (x86)\PCL 1.6.0\include\pcl-1.6\pcl/kdtree/kdtree_flann.h(520): error C2872: 'flann' : ambiguous symbol
              could be 'flann'
              or       'cv::flann'

看起来OpenCV自带的Flann文件与PCL中的Flann文件发生了冲突。

有什么建议吗?

编辑

这里有一个类似的问题PCL、OpenCV和Flann冲突,但是错误略有不同...

编辑2

所以在我的main.cpp文件中,我之前有以下代码:

using namespace pcl; using namespace cv;

我将它们注释掉并更新了程序使用cv::Mat等。

但是当我添加...时仍然在编译过程中出现错误。

#include <pcl/segmentation/segment_differences.h>

C:\Program Files (x86)\PCL 1.6.0\include\pcl-1.6\pcl/kdtree/kdtree_flann.h(520): error C2872: 'flann' : ambiguous symbol 
          could be 'flann' 
          or       'cv::flann'

我刚试过将include\opencv2\flann\重命名为include\opencv2\flanncv\并更新大量opencv头文件中的包含内容到这个新的flanncv目录。但是我仍然得到上述错误...


啊,这是一个很糟糕的错误。你是怎么安装PCL和OpenCV的?也许你可以从源代码编译它们,并使它们指向FLANN的同一安装位置? - Moataz Elmasry
我使用了它们提供的Windows安装程序。我猜我可以尝试编译它们来使用相同的flann文件,但我不是很确定如何操作。 - YMDW
每个文件都有一个自述文件,显示如何编译。 - Moataz Elmasry
3个回答

4

如果不想重建东西,可以通过添加空名称空间来解决此问题。

将flann::something的实例更改为::flann::something。

我认为这有效地告诉它使用全局名称空间而不是cv名称空间。


如果这个能够正常工作,那么工作做得很好。我今天学到了一些东西。 - Moataz Elmasry
问题在于,OpenCV自带其自己的flann库,与PCL所依赖的flann库发生冲突。我尝试过重命名命名空间,但由于某些原因它并没有起作用,但编辑包含路径却解决了这个问题。然而,更新的PCL 1.7通过将命名空间从flann::更改为::flann::来避免此问题,这是更加简洁的解决方案! - Fei

0

我在Linux下使用pcl和openCv,但是问题来了。

问题在于两个库都包含了头文件flann/flann.hpp或类似的文件,其中定义了命名空间flann。

现在我不知道这些库在你的机器上是如何安装的,但我假设你使用了可安装版本的pcl和openCv,因此每个库都带有自己的flann库。

通常在两个库的CMakeLists中都会有一行搜索flann库的代码,类似于:INCLUDE_LIBRARY($(flann) REQUIRED)

解决方案可能是删除已安装的pcl和openCv库,然后从flann网站下载并安装flann。接着下载openCv和pcl的夜间构建版本,编译它们,它们应该都能找到同一个flann实例,这样问题可能就解决了。

编辑: 还有一个想法,也许问题只是因为你在代码中使用了:

using namespace pcl;
using namespace cv;

所以你有两个不同的flann命名空间实例。删除所有"using namespace",并在你的代码中使用pcl::thepclclass、cv::theopencvclass,看看是否有帮助。

祝好运


嗯,那个好像没什么运气,我已经编辑了上面的内容,写出了我尝试过的东西。 - YMDW
我在Linux上使用pcl和openCv在一个项目中,没有任何问题。问题是它们都依赖于相同版本的flann。我非常确定,如果您成功地单独安装了flann,然后下载并编译pcl和openCv以依赖于此已安装的flann版本,您可能会解决这个问题。 - Moataz Elmasry
OpenCV和PCL使用的flann文件是相同的还是为了与OpenCV或PCL一起使用而进行了调整?它们一直愉快地一起工作,直到我使用#include <pcl/segmentation/segment_differences.h>。 - YMDW
据我所知,他们只是使用了flann库而没有进行任何调整,但你可以在pcl列表上询问,因为flann的作者是其中的活跃成员。 - Moataz Elmasry
我在Ubuntu 14.04上使用OpenCV 3.2和PCL 1.7时遇到了OpenCV-PCL flann冲突的问题 - 省略"using namespace cv;"并在每个地方添加cv::对我有用。这个答案更简单:https://stackoverflow.com/a/15135264/975443 - Kozuch

0
解决方案很简单,只需在 flann 前面添加双冒号 (::) 即可。 然后一切都会正常工作。
例如,原来是这样的:
flann::Matrix<ElementType>(new ElementType[size_*dim_], size_, dim_);

变成了:

::flann::Matrix<ElementType>(new ElementType[size_*dim_], size_, dim_);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接