0

我目前正在数字化旧的 VHS 磁带。对于后处理,我想使用 C++ 和 OpenCV 实现自定义算法。我已经在 Matlab 中实现了一个有前途的原型,但它只能处理单个图像(在我的版本(R2010a)中无法读取/写入视频文件;而且,Matlab 太慢了)。

可悲的是,我 - 一遍又一遍 - 坚持使用 CMake。虽然我想知道......这不会那么难。我经常遇到 CMake 的问题,所以我将在这里详细介绍。我希望您不仅可以向我指出我在这里做错了什么,还可以对我使用 CMake 提供一般性建议。也许我做错了,我不知道。

这是我到目前为止所做的:

  1. 我已经从 sourceforge下载了OpenCV 2.3.1 superpack 。superpack 包含 OpenCV 源代码,包括并且 - 最重要的是 - 用于所有主要平台的 .lib 和 .dll 文件。因此,我不需要自己构建 OpenCV。它已经完成了。我只需要使用/链接它。
  2. 我在C:\dev\vs2010sp1_win32\opencv\2.3.1.
  3. 我已重命名C:\dev\vs2010sp1_win32\opencv\2.3.1\OpenCVConfig.cmake.inOpenCVConfig.cmake.
  4. 我为我的项目创建了一个文件夹,C:\dev\VhsDejitterizer其结构如下:

VhsDejitterizer/
    CMakeLists.txt (A)
    src/
        CMakeLists.txt (B)
        libvhsdejitter/
            CMakeLists.txt (C)
            vhsdejitter/
                util.h
                util.cpp
        main/
            CMakeLists.txt (D)
            main.cpp

以下是各个 CMakeLists.txt 文件的内容。

/CMakeLists.txt (一)

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT("VhsDejitterizer")

CMAKE_POLICY(SET CMP0015 OLD)
FIND_PACKAGE(OpenCV REQUIRED
            NO_MODULE
            PATHS "C:/dev/vs2010sp1_win32/opencv/2.3.1"
            NO_DEFAULT_PATH)

ADD_SUBDIRECTORY("src")

/src/CMakeLists.txt (B)

ADD_SUBDIRECTORY("libvhsdejitter")
ADD_SUBDIRECTORY("main")

/src/libvhsdejitter/CMakeLists.txt (C)

UNSET(source_files)
FILE(GLOB_RECURSE source_files "*.h" "*.cpp")

ADD_LIBRARY(libvhsdejitter STATIC ${source_files})
TARGET_LINK_LIBRARIES(libvhsdejitter ${OpenCV_LIBS})

UNSET(source_files)

/src/main/CMakeLists.txt (D)

UNSET(source_files)
FILE(GLOB_RECURSE source_files "*.h" "*.cpp")

ADD_EXECUTABLE(main ${source_files})
TARGET_LINK_LIBRARIES(main libvhsdejitter ${OpenCV_LIBS})

UNSET(source_files)

配置和生成 Visual Studio .sln (...) 文件效果很好。事实上,我没有收到任何警告或错误:

Configuring done
Generating done

但是,我在 Visual Studio 中构建“主”项目的尝试失败了:

1>------ Build started: Project: main, Configuration: Debug Win32 ------
1>Build started 04.04.2012 14:38:47.
1>InitializeBuildStatus:
1>  Touching "main.dir\Debug\main.unsuccessfulbuild".
1>CustomBuild:
1>  All outputs are up-to-date.
1>ClCompile:
1>  main.cpp
1>LINK : fatal error LNK1104: cannot open file '@CMAKE_LIB_DIRS_CONFIGCMAKE@/libopencv_gpu.so.@OPENCV_VERSION@@OPENCV_DLLVERSION@@OPENCV_DEBUG_POSTFIX@.lib'
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.59
========== Build: 0 succeeded, 1 failed, 2 up-to-date, 0 skipped ==========

更多细节:

  • 操作系统:Windows 7 Pro 64 位
  • IDE:Visual Studio 2010 SP1
  • CMake 版本:2.8.4
  • 目标平台(即我要为什么编译/构建):Windows 32 位

我的问题:

  1. 如何成功构建“主”项目?即如何解决该错误?
  2. 这些是什么@VARIABLE_OR_SOMETHING@?我试图找出它们来自哪里,它们似乎是在OpenCVConfig.cmake. 但他们应该如何工作?它们是否应该在“构建时”由 Visual Studio 评估?如果是这样,他们是如何评估的?
  3. 您可能已经注意到我已经建立了一个相当复杂的文件夹结构。你对此有什么建议吗?你如何组织你的图书馆和项目?有最佳实践吗?它们在哪里记录?

谢谢你和最好的问候,罗伯特

4

3 回答 3

1

这些变量可能与 CMake 的configure_file命令有关,该命令允许您指定参数化模板文档(通常以扩展名结尾.in),并且您可以将 CMake 变量替换到文件中以创建它。它们在configure_file调用时进行评估,这发生在运行 CMake 时。我认为正在发生的事情是,您使用的那个将有一个父 CMake 脚本,它将使用这些变量的内容配置该文件,然后在add_subdirectory调用中使用它。我建议检查任何描述顶级运行过程的自述文件(或任何定义这些变量然后手动替换它们的文件)。

于 2012-04-04T14:37:43.277 回答
1

我现在已经修好了。我想我可以肯定地说整个混乱不是我的错。很抱歉回答我自己的问题。


这是我首先尝试的(当然,这对我不起作用,但它可能对其他人有用):

正如 Martin Foot 在他的回答中指出的那样,*.in 文件是模板,应该在 CMake 配置期间用正确的值填写。但是,我使用的是 OpenCV 超级包,其中包含所有二进制文件。出于这个原因,我从来没有执行过这样的配置步骤,因为我认为只有在你想编译某些东西时才需要这样做。

但是,似乎 - 即使您使用带有预构建二进制文件的超级包 - 您也必须配置项目才能生成 OpenCVConfig.cmake。Vadim Pisarevsky在 OpenCV bug tracker 中声明了这一点

出于某种原因,这对我不起作用。我像往常一样启动了 Cmake GUI,将其指向 OpenCV 目录并点击“配置”。我什至绝望地点击了“生成”。然而,没有出现 OpenCVConfig.cmake。

所以我不得不更进一步......


这实际上是有帮助的:

在最近提交的与 OpenCVConfig.cmake 相关的错误报告中,Sergiu Dotenco 指出“当前提供的 OpenCVConfig.cmake 非常脆弱”等。幸运的是,Sergio 还提供了自定义 FindOpenCV.cmake 脚本。通过使用他的脚本,我终于能够生成一个有效的 Visual Studio 解决方案。

顺便说一下,这是我当前的顶级 CMakeLists.txt:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT("VhsDejitterizer")

SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules" ${CMAKE_MODULE_PATH})

SET(OPENCV_ROOT_DIR "C:/dev/vs2010sp1_win32/opencv/2.3.1")
#SET(OPENCV_USE_GPU_LIBS ON)
FIND_PACKAGE(OpenCV REQUIRED)

ADD_SUBDIRECTORY("src")

我已经在项目FindOpenCV.cmake的一个新子文件夹中安装了 Sergio 的脚本cmake-modules/。同样重要的是要注意我正在使用(与我使用“配置模式”的原始设置相反)最小的 FIND_PACKAGE 变体(“模块模式”)。仅当使用最小变体时,CMake 才会Find<package-name>.cmake在 CMake 模块路径中查找脚本。请参阅FIND_PACKAGE 的 CMake 文档


我还找到了本指南,如果您是库开发人员,该指南是关于如何正确使用 CMake:http ://www.vtk.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file

于 2012-04-04T16:27:33.520 回答
0

我现在已经修好了。我想我可以肯定地说整个混乱不是我的错。很抱歉回答我自己的问题。

你修好了?我遇到了同样的问题,我按照您的解决方案进行了操作,但是没有用。当 CMake 执行命令 FIND_PACKAGE( OpenCV REQUIRED )

它会输出:

One or more OpenCV components were not found:
  calib3d
  contrib
  core
  features2d
  flann
  highgui
  imgproc
  legacy
  ml
  objdetect
  video
CMake Error at C:/Program Files/CMake 2.8/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:91 (MESSAGE):
  Could NOT find OpenCV (missing: OPENCV_CALIB3D_LIBRARY
  OPENCV_CONTRIB_LIBRARY OPENCV_CORE_LIBRARY OPENCV_FEATURES2D_LIBRARY
  OPENCV_FLANN_LIBRARY OPENCV_HIGHGUI_LIBRARY OPENCV_IMGPROC_LIBRARY
  OPENCV_LEGACY_LIBRARY OPENCV_ML_LIBRARY OPENCV_OBJDETECT_LIBRARY
  OPENCV_VIDEO_LIBRARY) (found version "2.3.1")

最后,我使用了命令 include_directories TARGET_LINK_LIBRARIES 来包含所有必要的目录或文件,它以一种尴尬的方式工作!

于 2012-04-30T01:56:17.637 回答