月別アーカイブ: 2012年12月
NativeViewerの使い方
この記事はComputer Vision Advent Calendar 2012の12/8の記事兼@sakanazensenさんへの誕生日プレゼントとして書いたものです.
つい最近,OpenCVプログラムのデバッグ中にMatの中身をプレビューできるプラグイン「NativeViewer」のv1.0がリリースされました.このプラグインの使い方について解説記事の要望があったので(30分くらいでてきとーに)書いてみました.基本的に公式のQuickStartGuideとほぼ同じ内容です.
以降の説明はVisual Studio 2012を使って説明します(Visual Studio 2010版のプラグインも用意されています).
※注意:Visual Studio Professional以上のエディションでしかプラグインは使えないようです.
■ダウンロード
配布ページからNativeViewer_VS2012_v1.0.0.vsixをダウンロードします.
■インストール
ダウンロードしたNativeViewer_VS2012_v1.0.0.vsixをダブルクリックすると以下のようなインストール画面が表示されます.ここで「インストール」ボタンを押すとインストール完了です.
■サンプルコード
なんてこともない2値化のサンプルです.このサンプルを用いて使い方の説明を行います.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; #ifdef _DEBUG #pragma comment(lib, "opencv_core243d.lib") #pragma comment(lib, "opencv_imgproc243d.lib") #pragma comment(lib, "opencv_highgui243d.lib") #else #pragma comment(lib, "opencv_core243.lib") #pragma comment(lib, "opencv_imgproc243.lib") #pragma comment(lib, "opencv_highgui243.lib") #endif int main( int argc, char** argv) { Mat image; Mat gray; Mat bin; //(1)画像読み込み image = imread(argv[1], 1); //(2)グレースケール化 cvtColor(image, gray, CV_BGR2GRAY); //(3)2値化 threshold(gray, bin, 100, 255, THRESH_BINARY); //(4)2値化画像の表示 namedWindow("bin", 1); imshow("bin", bin); waitKey(0); return 0; } |
■実際に使ってみる
この例では2値化結果をウィンドウに描画していますが,デバッグの時に2値化の前のグレースケールが正しい結果なのか知りたいような場合もあって,従来はグレースケール用にnamedWindowとimshowを追加し,リビルド・再実行する必要がありました.地味に面倒くさいです。。。この例ではリビルドしてもそんなに時間はかかりませんがそれなりの規模のプログラムだとビルド時間がもったいないです.
NativeViewerを使うとデバッグ用に新たにnamedWindowとimshowを追加してリビルドするといった面倒な作業から解放されます.やるのはデバッグ中にCtrlキーを押しながらプレビューしたいMatクラスの変数にマウスカーソルを合わせるだけです.
ここではデバッグ中にCtrlキーを押しながら「gray」という変数にマウスカーソルを合わせてみます.すると,以下のようなプレビュー画面が表示され,grayの描画内容を視覚的に確認することができます.デバッグ時にとても便利なのでVisual Studio使いにはオススメのプラグインです!
■オプション
また,Visual Studioのオプション画面からNativeViewerに関するレイアウト等の設定を行うことができます.
■アンインストール
「拡張機能と更新プログラム」画面から「NativeViewer」を選択して,「アンインストール」ボタンを押すことでプラグインをアンインストールすることができます.
■余談
12/22あたりにComputer Vision Advent Calendar 2012向けの別の記事公開予定です(他人事).過度な期待はせずにお待ちください。。。
OpenCVのビルド情報表示
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使ってるのかー
などの情報が簡単にわかるようになります.