基于cmake的项目中使用OpenCV:检查contrib模块

3

我已经安装了OpenCV 3.0(从源代码编译而来),并使用以下方法将其包含在基于CMake的项目中:

find_package(OpenCV 3.0 REQUIRED)

使用它一切正常,但我也想使用contrib模块。我在构建OpenCV时指定了OPENCV_EXTRA_MODULES_PATH,并确信这些模块可用(我可以在项目中使用它们),但我想在没有contrib模块的情况下禁用此功能,即编写类似以下内容的代码:

#ifdef HAVE_OPENCV_CONTRIB
// some tasty functionality
#else
// some replacement or dummies
#endif

是否有办法在我的CMakeLists.txt文件中确定它,而不需要添加显式定义?也就是说,我想在我的CMakeLists.txt文件中执行以下操作:

if (DEFINED ${OPENCV_BUILD_WITH_CONTRIB})
add_definitions(-DHAVE_OPENCV_CONTRIB)
endif(DEFINED ${OPENCV_BUILD_WITH_CONTRIB})

也许有一种简单的方法 - 在find_package(OpenCV)之后定义任何已定义的变量?
2个回答

3

现在检查模块的规范方式是使用find_packageCOMPONENTS选项:

find_package(OpenCV 4 COMPONENTS bgsegm)
if(OpenCV_bgsegm_FOUND)
  add_definitions("-DHAVE_BGSEGM")
endif()

这适用于 contrib 和 非 contrib 模块。


是的,OpenCV 4及更高版本的CMake引入了该功能,现在它是首选方式。但回到2015年(或更早版本),它不起作用。 - avtomaton

2
现在我只能通过检查目标系统中某个贡献模块的头来确定它,例如以下内容:
include(CheckIncludeFileCXX)
check_include_file_cxx(opencv2/face/facerec.hpp HAVE_OPENCV_CONTRIB)
if(HAVE_OPENCV_CONTRIB)
    add_definitions(-DHAVE_OPENCV_CONTRIB)
endif(HAVE_OPENCV_CONTRIB)

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