0

現在、古いVHSカセットをデジタル化しています。後処理については、C++ と OpenCV でカスタム アルゴリズムを実装したいと考えています。私はすでにMatlabで有望なプロトタイプを実装していますが、単一の画像しか処理できません(私のバージョン(R2010a)ではビデオファイルの読み取り/書き込みはできません;また、Matlabは遅すぎます)。

悲しいことに、私は - 何度も何度も - CMake に行き詰まっています。とは思いますが… これはそれほど難しいことではありません。私はよくCMake で問題を抱えていたので、ここで詳しく説明します。ここで私が間違っていることを指摘するだけでなく、私の CMake の使用法についても一般的なアドバイスをいただければ幸いです。たぶん私はそれをすべて間違ってやっています、私にはわかりません。

これが私がこれまでに行ったことです:

  1. sourceforge からOpenCV 2.3.1 スーパーパックをダウンロードしました。スーパーパックには、OpenCV ソース コード、インクルード、そして最も重要なすべての主要プラットフォーム用の .lib および .dll ファイルが含まれています。このため、OpenCV を自分でビルドする必要はありません。それはすでに行われています。使用/リンクするだけです。
  2. のスーパーパックをインストール (展開) しましたC:\dev\vs2010sp1_win32\opencv\2.3.1
  3. に改名C:\dev\vs2010sp1_win32\opencv\2.3.1\OpenCVConfig.cmake.inしましたOpenCVConfig.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 (A)

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 (...) ファイルの構成と生成はうまく機能します。実際、警告やエラーは 1 つも表示されません。

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: ビジュアル スタジオ 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が . configure_fileこれらは、CMake の実行時に発生する呼び出し時に評価されます。何が起こっているかというと、あなたが取ったものの親CMakeスクリプトがあり、それらの変数の内容でそのファイルを構成し、それをadd_subdirectory呼び出しで使用するということです。トップレベルの実行プロセスを説明している readme (またはそれらの変数を定義し、手動で置き換えるファイル) を確認することをお勧めします。

于 2012-04-04T14:37:43.277 に答える
1

私は今それを修正しました。全体の混乱は私のせいではなかったと安全に言うことができると思います. 自分の質問に答えてすみません。


これが私が最初に試したことです(もちろん、これは私にはうまくいきませんでしたが、他の人にはうまくいくかもしれません):

Martin Foot が彼の回答で指摘したように、*.in ファイルは、CMake 構成中に適切な値が入力されることになっているテンプレートです。ただし、すべてのバイナリを含む OpenCV スーパーパックを使用しています。このため、このような構成手順を実行したことは一度もありません。これは、何かをコンパイルする場合にのみ必要であると想定していたからです。

ただし、ビルド済みのバイナリでスーパーパックを使用している場合でも、 OpenCVConfig.cmake を生成するにはプロジェクトを構成する必要があるようです。Vadim Pisarevskyは、OpenCV バグ トラッカーで次のように述べています。

何らかの理由で、これはうまくいきませんでした。いつものように Cmake GUI を起動し、OpenCV ディレクトリを指定して [Configure] をクリックしました。必死になって「Generate」まで押してしまいました。それでも、OpenCVConfig.cmake は表示されませんでした。

だから私はさらに先に進まなければなりませんでした...


これが実際に役立ったものです:

最近提出された OpenCVConfig.cmake に関連するバグレポートで、 Sergiu Dotenco 氏は「現在提供されている OpenCVConfig.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")

プロジェクトの新しいサブフォルダーにSergio のFindOpenCV.cmakeスクリプトをインストールしました。また、私が ( 「構成モード」を使用した元のセットアップとは対照的に) 最小限の FIND_PACKAGE バリアント ( 「モジュール モード」cmake-modules/ )を使用していることに注意することも重要です。最小限のバリアントが使用されている場合のみ、CMake はCMake モジュール パスでスクリプトを探します。FIND_PACKAGEの CMake ドキュメントを参照してください。Find<package-name>.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 に答える