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値化のサンプルです.このサンプルを用いて使い方の説明を行います.

■実際に使ってみる
この例では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: 1700

C/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: YES

OpenCV 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 python

GUI:
QT 4.x: NO
Win32 UI: YES
OpenGL support: NO

Media 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: NO

Video 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: NO

Other 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: NO

Python:
Interpreter: NO

Tests and samples:
Tests: YES
Performance tests: YES
Examples: NO

Install 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使ってるのかー

などの情報が簡単にわかるようになります.

「OpenCV 2 プログラミングブック」レビュー

マイナビ様より「OpenCV 2 プログラミングブック」を献本頂きましたのでレビューを
簡単にまとめたいと思います.購入する際の参考にして頂ければと思います.

[tmkm-amazon]4839941262[/tmkm-amazon]

構成としては書籍ページの目次に沿って(本音ベースで)書いています.

▽Chapter.1 導入 編
OpenCVの歴史だけでなくてライセンス面の記載も
これまでの書籍に比べてしっかり書かれている印象です。

▽Chapter.2 スタートアップ 編
1 OpenCV 2.3簡単インストール(Windows編)
2 OpenCVをMacで利用する
3 Ubuntu 10.04 LTSでOpenCVを利用する

スクリーンショット付きで解説が丁寧なのと,Win,Mac,Linux一通り載っているのは○。
あと,Linuxでよくトラブルになりがちなカメラキャプチャについてもシステムの問題か
OpenCVの問題かを切り分けるための基本アプリ紹介は地味にうれしいかも。

4 C++インタフェース
従来の書籍ではあまり触れられていないC, C++ I/Fの違いやC,C++ I/Fの共存方法についての
記載はこれまでC I/Fで作った資産を再活用したい場合には嬉しいです。

5 Pythonインタフェース
スクリーンショット付きでわかりやすいのと結構嵌りがちなNumpyインストールも
きちんと書かれています。Mac,Linuxについては紙面の都合で省略?
 
6 GPUによる画像処理
GPU関連の記載はちょっと薄めな印象。
おそらく,執筆当時はあまりGPU機能が有効になる関数が多くなかったことや
最近のGPU実装更新のスピードが速いためだと思われます。ただ,基本的な使い方は
押さえてあるので導入についてはすんなり読めるはず。欲を言うなら,
GPU実装されている関数リスト等があると便利かも。

▽Chapter.3 リファレンス 編
1 cv::Matの基本処理
2 線形代数
3 画像処理
4 描画処理

C++ I/F最初の難関であるMatの使い方や基本的な画像処理の関数の使い方が
一通り網羅されています。サンプル付きなので非常にとっかかりやすいと思います。

5 入出力
6 その他の機能

画像の読み書きやカメラキャプチャ等よく使う機能は一通り網羅されているため,
サンプルを参考にすれば大抵のことはできると思います.
欲を言えばDirectShowを使ったキャプチャもVideoCaptureで使えることが
あまり知られていないようなのでその辺の記述もあるとなお良いかも。
あと,Qtを有効にした場合の基本的な使い方もあるとうれしかったです(結構便利なので)。

▽Chapter.4 ケーススタディ 編
1 画素値の直接操作

画素アクセス方法別の速度比較はパフォーマンス的に重要なトピックなので
初学者だけでなくとも読む価値があると思います。
 
2 カメラキャリブレーションとステレオ視による距離計測
基本的なキャリブレーションのやり方については記載されているので簡単に試せます。
欲を言えば2.3から導入されたCirclesGridを使ったキャリブレーションの
記事もあると嬉しかったかも。

3 画像のJPEG圧縮とPSNRの計算
これまでのOpenCV本ではあまり取り上げられていないと思われる画像指標PSNRについて
記載があるので,この辺りのデータを取る必要がある研究者向けとしては割とうれしいトピック。

4 簡単な笑顔度の算出
5 CAPTCHA画像の生成

比較的簡単なアルゴリズムの組み合わせによる笑顔度算出サンプルが紹介されている。
OpenCVの中身に慣れてきたら自身でアルゴリズム改善等をしてみて楽しめるトピック。

6 KinectとOpenCVの連携
Kinect連携はOpenCVを使ってやるサンプルはWeb上にそこまで多くない(Kinectを
他のSDK叩くサンプルが多い)のでサンプルとしてまとまっているのは重宝するかも。
 
7 ミニチュア風画像処理
8 SURF特徴を使ったイメージモザイキング
このあたりのトピックは最近のスマートフォン向け画像処理アプリでよく使われると思われるので
オリジナルの画像編集アプリ等を作りたい場合には参考になりそう。

9 機械学習と画像処理
クラスタリングの話がメイン。
この分野の需要はあると思われるのでもう少しボリュームがあると嬉しいかも。
(OpenCVの機械学習がアレなので意図的に削られた?)

10 顔の子供化
11 Photoshop向けプラグインの作成

OpenCVを使ったPhotoshop向けプラグイン作成の記事は
従来のOpenCV本には無いはずなので,自前で作ったアルゴリズムを俺々Photoshopプラグインを
作りたい場合には有用(おそらくWeb上にもあまり情報は無いはず)。

12 動画ファイルをカメラ入力のように扱う
研究の場合,動画ファイルを入力としてアルゴリズム実装することが多いので
開発効率という点でこのトピックは嬉しいと思います。よく動画読み込みで
コーデック関連のトラブルを耳にするのでその辺まで突っ込んだ記事があれば良かったかも。