![](/img/trans.png)
[英]installing OpenCV-2.3.0-win-superpack on visual studio 2010
[英]How to properly link Visual Studio project with OpenCV (superpack) using CMake
我目前正在對舊的 VHS 磁帶進行數字化處理。 對於后處理,我想用 C++ 和 OpenCV 實現自定義算法。我已經在 Matlab 中實現了一個有前途的原型,但它只能處理單個圖像(在我的版本 (R2010a) 中無法讀取/寫入視頻文件) ; 另外,Matlab 太慢了)。
可悲的是,我 - 一遍又一遍 - 堅持使用 CMake。雖然我想知道......這不會那么困難。 我經常遇到 CMake 的問題,所以我會在這里詳細介紹 go。 我希望您不僅可以指出我在這里做錯了什么,還可以對我對 CMake 的使用提出一般性建議。 也許我做錯了,我不知道。
這是我到目前為止所做的:
C:\dev\vs2010sp1_win32\opencv\2.3.1
中安裝(即提取到)超級包。C:\dev\vs2010sp1_win32\opencv\2.3.1\OpenCVConfig.cmake.in
為OpenCVConfig.cmake
。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 ==========
更多詳情:
我的問題:
@VARIABLE_OR_SOMETHING@
是什么? 我試圖找出它們的來源,它們似乎是在OpenCVConfig.cmake
中設置的。 但它們應該如何工作? 它們應該在“構建時”由 Visual Studio 評估嗎? 如果有,他們是如何評價的?謝謝你和最好的問候,羅伯特
這些變量可能與 CMake 的configure_file命令有關,它允許您指定參數化模板文檔(通常擴展名以.in
結尾),您可以將 CMake 變量替換到文件中以創建它。 它們在運行 CMake 時發生的configure_file
調用時被評估。我認為發生的事情是你所采用的腳本將有一個父 CMake 腳本,它將使用這些變量的內容配置該文件,並且然后在add_subdirectory
調用中使用它。 我建議檢查任何描述頂級運行過程的自述文件(或任何定義這些變量然后手動替換它們的文件)。
我現在修好了。 我想我可以肯定地說整個混亂不是我的錯。 很抱歉回答我自己的問題。
這是我首先嘗試的(當然,這對我不起作用,但它可能對其他人有用):
正如 Martin Foot 在他的回答中指出的那樣,*.in 文件是模板,應該在 CMake 配置期間填寫正確的值。 但是,我使用的是 OpenCV 超級包,其中包含所有二進制文件。 出於這個原因,我從來沒有執行過這樣的配置步驟,因為我認為只有在您想要編譯某些東西時才需要這樣做。
但是,似乎 - 即使您使用帶有預構建二進制文件的超級包 - 您也必須配置項目才能生成 OpenCVConfig.cmake。 Vadim Pisarevsky在 OpenCV bug tracker 中表示。
出於某種原因,這對我不起作用。 我像往常一樣啟動 Cmake GUI,將其指向 OpenCV 目錄並點擊“配置”。 我什至絕望地點擊了“生成”。 然而,沒有出現 OpenCVConfig.cmake。
所以我不得不進一步撥打 go...
這才是真正有用的:
在最近提交的與 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")
我在項目的新cmake-modules/
子文件夾中安裝了 Sergio 的FindOpenCV.cmake
腳本。 同樣重要的是要注意我正在使用(與我使用“配置模式”的原始設置相反)最小的 FIND_PACKAGE 變體( “模塊模式” )。 僅當使用最小變體時,CMake 才會在 CMake 模塊路徑中Find<package-name>.cmake
腳本。 有關 FIND_PACKAGE 的信息,請參閱CMake 文檔。
我還找到了本指南,如果您是圖書館開發人員,它是關於如何正確使用 CMake 的: http://www.vtk.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file
我現在修好了。 我想我可以肯定地說整個混亂不是我的錯。 很抱歉回答我自己的問題。
你修好了? 我遇到了同樣的問題,我按照你的解決方案做了,但是沒有用。 當 CMake 執行命令 FIND_PACKAGE( OpenCV REQUIRED )
它將是 output:
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 來包含所有必要的目錄或文件,它以一種笨拙的方式工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.