OpenCVをCMakeでビルドして使う場合,CMakeオプションから様々な機能(TBB使用/CUDA使用/FFMPEG使用 etc…)のON/OFFを切り替えることができます.そのため,実際に使う場合の選択肢としてこれらの機能の組み合わせが大量に存在することになります.
これはユーザが多様な使い方を選択できるというメリットがある反面,複数のメンバでバグを調査する際に再現環境の情報共有が面倒であるというデメリットがあります.
例:CUDAを使った関数でバグが起きているケース
Aさん「OpenCV 2.4.3のWindows環境でこのバグを調査しといて」
Bさん「バグが再現しません」
Aさん「おかしいなー.TBB有効にしてるよね?」
Bさん「有効にしてます」
~こんなやり取りがしばらく続く~
Aさん「CUDA有効にしてる?」
Bさん「有効にしてないです」
Aさん「あー,こっちは有効にしてるのでそれで試してみて」
Bさん「・・・」
この例を見てもわかるようにとても面倒かつ非生産的ですね・・・.
この問題点を解消するためにOpenCV 2.4.0からOpenCVライブラリのビルド情報を出力することができるcv::getBuildInformation()関数が追加されています.実際に使う場合にはプログラム中に以下のような処理を1行追加するだけなのでとても簡単です.
std::cout << cv::getBuildInformation() << std::endl;
バグを調査する際にはまず再現させるということが重要です.そのため,公式へのバグ報告時にはこれらの情報も記載してあげた方が良いでしょう.以下にVS2012でOpenCV 2.4.3をビルドした場合の出力例を示します.
General configuration for OpenCV 2.4.3 =====================================
Platform:
Host: Windows 6.2 x86
CMake: 2.8.10.2
CMake generator: Visual Studio 11 Win64
CMake build tool: C:/PROGRA~2/MICROS~3.0/Common7/IDE/devenv.com
MSVC: 1700C/C++:
Built as dynamic libs?: YES
C++ Compiler: C:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/bin/x86_amd64/cl.exe
C++ flags (Release): /DWIN32 /D_WINDOWS /W4 /GR /EHa /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:AVX /Oi /wd4251 /MD /O2 /Ob2 /D NDEBUG /Zi
C++ flags (Debug): /DWIN32 /D_WINDOWS /W4 /GR /EHa /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:AVX /Oi /wd4251 /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
C Compiler: C:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/bin/x86_amd64/cl.exe
C flags (Release): /DWIN32 /D_WINDOWS /W3 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:AVX /Oi /MD /O2 /Ob2 /D NDEBUG /Zi
C flags (Debug): /DWIN32 /D_WINDOWS /W3 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /arch:AVX /Oi /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
Linker flags (Release): /STACK:10000000 /machine:x64 /INCREMENTAL:NO /debug
Linker flags (Debug): /STACK:10000000 /machine:x64 /debug /INCREMENTAL
Precompiled headers: YESOpenCV modules:
To be built: core imgproc flann highgui features2d calib3d ml video objdetect contrib nonfree photo legacy gpu stitching ts videostab
Disabled: world
Disabled by dependency: –
Unavailable: androidcamera java ocl pythonGUI:
QT 4.x: NO
Win32 UI: YES
OpenGL support: NOMedia I/O:
ZLib: build (ver 1.2.7)
JPEG: build (ver 62)
PNG: build (ver 1.5.12)
TIFF: build (ver 42 – 4.0.2)
JPEG 2000: build (ver 1.900.1)
OpenEXR: NOVideo I/O:
FFMPEG: YES (prebuilt binaries)
codec: YES (ver 53.61.100)
format: YES (ver 53.32.100)
util: YES (ver 51.35.100)
swscale: YES (ver 2.1.100)
gentoo-style: YES
OpenNI: NO
OpenNI PrimeSensor Modules: NO
PvAPI: NO
GigEVisionSDK: NO
DirectShow: YES
XIMEA: NOOther third-party libraries:
Use IPP: NO
Use TBB: YES (ver 4.1 interface 6101)
Use C=: NO
Use Cuda: NO
Use OpenCL: NO
Use Eigen: NOPython:
Interpreter: NOTests and samples:
Tests: YES
Performance tests: YES
Examples: NOInstall path: C:/dev/OpenCV-2.4.3/build/install
cvconfig.h is in: C:/dev/OpenCV-2.4.3/build
—————————————————————–
色々情報が出ていますが簡単に眺めてみると,
「MSVC: 1700」
→Visual Studio 2012使ってるのかー
「DirectShow: YES」
→ビデオキャプチャはDirectShow使ってるのかー
「Use TBB: YES (ver 4.1 interface 6101)」
→TBBが有効になっててTBB 4.1使ってるのかー
などの情報が簡単にわかるようになります.