Visual Studio + Image Watch プラグインで快適 OpenCV 画像処理開発
この記事はOpenCV Advent Calendar 2021の 24 日目の記事です。文体は真面目ですが、内容はゆるふわにいきます。ふわふわ~。
はじめに
OpenCV の Python bindings は便利ですよね。特に Jupyter notebook と組み合わせて処理結果を見ながら画像処理を組み立てて行ったりとかが簡単に出来ます。一方で C++ での OpenCV 開発の場合はどうでしょうか? 結果を一々 imwrite
してたりしませんか? Windows で Visual Studio を使っている場合は、この記事で紹介する Visual Studio の Image Watch プラグインを使えばそんなことしなくても画像を見ながらデバッグが出来ます。
Image Watch plugin のインストール
Visual Studio Marketplace で "image watch" を検索します。
検索結果のうち、Image Watch
という名前のプラグインは VS 2012, 2013, 2015 用です。それ以外はバージョン名の付いたプラグインを選択します。今なら VS 2022 が最新なので 上の検索結果でいうと一番上の段右から 2 番目の Image Watch for Visual Studio 2022
を選択し、Download ボタンで ImageWatch.vsix
をダウンロード、実行して VS 2022 にインストールします。
OpenCV を使ったプロジェクトを作成&設定する
今回はOpenCV Advent Calendar 2017 5日目 | Vcpkgを使用してOpenCVを導入するという記事に準じて vcpkg でインストールしました。記事とは違い CMake プロジェクトにはしませんでしたが、CMake プロジェクトとしても同じです。また、Releases にあるインストーラを使ってインストールしても同じです。
とりあえずこんなコードを書いてみます。イメージとしてはこの後 Deep Learning のモデルに食わすので、RGB の 32bit float、値の範囲を 0.0 ~ 1.0 にした、という感じです。この後の説明の都合でちょっと丁寧に中間結果を変数に保存しています。
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat img = cv::imread("Image.jpg");
cv::Mat img2;
cv::cvtColor(img, img2, cv::COLOR_BGR2RGB);
cv::Mat img3;
img2.convertTo(img3, CV_32F);
cv::Mat img4 = img3 / 255.0f;
std::cout << "Hello World!\n";
}
Image Watch プラグインの使い方
さて、ソースを書いたら Debug でビルドします。
終了しないよう、処理の終わった段階でブレークポイントを入れて、デバッグ実行します。デバッグ実行中にメニューから「表示」→「その他のウインドウ」→「Image Watch」を選択すると、Image Watch プラグインのウインドウが開きます。
左にブレークポイントで止まったときのローカル変数のうち、cv::Mat
型なもののサムネイルが並んでいます。img
がファイルから読み込んだもの、img2
が RGB2BGR したので、見た目には色がおかしく見える状態ですね(Image Watch プラグインは cv::Mat 型は BGR として解釈します)。img3
は CV_32F
に変換したので、0-255 のレンジになっていて、この状態では白飛びしています。0.0-1.0 のレンジにした img4
は見た目では img2
と同じになっています。
左のサムネイルから見たい画像を選ぶと右のペインに拡大されます。画像上にカーソルを合わせると、その位置の x 座標、y 座標、B/G/R それぞれの値が上の方に表示されます(スクショではカーソルがキャプチャできていないので分かりにくいですが)。
画像上でホイールを上下すると、カーソル位置を中心にズームイン/アウトします。拡大率が上がってくるとグリッド表示になり、さらに拡大率を上げると、画素値も表示されるようになります。
サムネイルを右クリックしたメニューに「Auto Maximize Contrast」という項目があります。オンオフのトグルになっていて、オンにすると画像内の最大・最小に合わせて表示コントラストを調整してくれます。今回の場合は 0-255 な img3
でオンにすると、下画像のように img2
や img4
と同じように表示されます。
先ほどは終了直前にブレークポイントを入れましたが、処理途中にブレークポイントを入れることももちろん出来ます。その場合は未初期化の cv::Mat
については下図のように [invalid]
とサムネイルに表示されます。もちろんステップ実行をしていって初期化・代入が行われると画像が表示されるようになります。
その他の機能
Visual Studio 本体のウォッチ式のように、特定の変数をウォッチし続けることもできます。右ペインの右クリックメニューから「Link Views」をオンにしておくと、複数の画像間で拡大位置の共有ができます。また、サムネイルの右クリックから「Dump to File」で PNG や JPEG などで保存出来るなど、説明しきれなかった機能がいくつかあります。詳しくは Image Watch のヘルプを確認してください。
おわりに
いかがでしたか。OpenCV を C++ で開発するハードルがぐっと下がったのではないでしょうか。個人的にはネイティブ実行でデバッグしつつ、最終的な出力は WebAssembly にするような CMake プロジェクトを作ってみたいと思っています。欠点としては Visual Studio のライセンスを気にしなければならないことがありますね。Community Edition が使用可能ならラッキーですね。そうじゃなかったらきちんと購入しましょう。
画像はぱくたそより「情熱に満ちた営業マンの写真素材」をお借りしました。
明日は @hon_no_mushi さんの「QRコードの生成のAPIを振り返る(1回目)(そして最終回)」です。いきなり最終回とのことで期待ですね!
Discussion