OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
Image Watch: Visual Studioデバッガでメモリ上の画像を表示する

前のチュートリアル: 「Microsoft Visual Studio」内でOpenCVを使ってアプリケーションをビルドする方法
次のチュートリアル: Java開発の概要

原著者Wolf Kienzle
互換性OpenCV >= 3.0
警告
このチュートリアルには古い情報が含まれている可能性がある。

Image Watchは、アプリケーションのデバッグ中にメモリ上の画像(たとえばcv::MatIplImage_オブジェクト)を可視化できる、Microsoft Visual Studio用のプラグインである。バグの追跡や、あるコードが何をしているかを単純に把握するのに役立つ。

前提条件

このチュートリアルでは、以下が利用可能であることを前提とする。

  1. Update 1をインストールしたVisual Studio 2012 Professional(またはそれ以上)。Update 1はこちらからダウンロードできる。
  2. Windowsマシン上へのOpenCVのインストール(チュートリアル: Windowsでのインストール)。
  3. Visual StudioでOpenCVプロジェクトを作成しビルドできること(チュートリアル: 「Microsoft Visual Studio」内でOpenCVを使ってアプリケーションをビルドする方法)。

インストール

Image Watchのインストーラーをダウンロードする。(Visual Studio 2019 | Visual Studio 2017 | Visual Studio 2012, 2013, 2015)インストーラーは拡張子.vsix(Visual Studio Extension)の単一ファイルとして提供される。起動するには、Windowsエクスプローラーで.vsixファイルをダブルクリックするだけでよい。インストーラーが完了したら、インストールを完了させるために必ずVisual Studioを再起動すること。

Image Watchは、OpenCVの画像オブジェクト(たとえばcv::Mat)を使う既存のあらゆるプロジェクトで動作する。この例では、ファイルから画像を読み込んでエッジ検出器を実行する最小限のテストプログラムを使用する。プログラムをビルドするには、Visual Studioでコンソールアプリケーションプロジェクトを作成し、「image-watch-demo」と名付け、以下のソースコードを挿入する。

// Test application for the Visual Studio Image Watch Debugger extension
#include <iostream> // std::cout
#include <opencv2/core/core.hpp> // cv::Mat
#include <opencv2/imgcodecs/imgcodecs.hpp> // cv::imread()
#include <opencv2/imgproc/imgproc.hpp> // cv::Canny()
using namespace std;
using namespace cv;
void help()
{
cout
<< "----------------------------------------------------" << endl
<< "This is a test program for the Image Watch Debugger " << endl
<< "plug-in for Visual Studio. The program loads an " << endl
<< "image from a file and runs the Canny edge detector. " << endl
<< "No output is displayed or written to disk."
<< endl
<< "Usage:" << endl
<< "image-watch-demo inputimage" << endl
<< "----------------------------------------------------" << endl
<< endl;
}
int main(int argc, char *argv[])
{
help();
if (argc != 2)
{
cout << "Wrong number of parameters" << endl;
return -1;
}
cout << "Loading input image: " << argv[1] << endl;
Mat input;
input = imread(argv[1], IMREAD_COLOR);
cout << "Detecting edges in input image" << endl;
Mat edges;
Canny(input, edges, 10, 100);
return 0;
}
n-dimensional dense array class
Definition mat.hpp:840
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
Definition core.hpp:107
STL namespace.

アクティブなソリューション構成(Build –> Configuration Manager)がデバッグビルド(通常は「Debug」と呼ばれる)に設定されていることを確認する。これによりコンパイラの最適化が無効になり、デバッガでの変数の表示が確実に機能するようになる。

ソリューションをビルドする(Build –> Build Solution、またはF7を押す)。

続行する前に、入力画像のコマンドライン引数をプロジェクトに追加することを忘れないこと(プロジェクトを右クリック –> Properties –> Configuration Properties –> Debuggingを開き、Command Argumentsフィールドに画像の場所を設定する)。

次に、以下のように書かれているソース行にブレークポイントを設定する

Mat edges;

ブレークポイントを設定するには、ソース行を右クリックし、コンテキストメニューからBreakpoints –> Insert Breakpointを選択する。

デバッガでプログラムを起動する(Debug –> Start Debugging、またはF5を押す)。ブレークポイントに到達すると、プログラムが一時停止し、Visual Studioはブレークポイントに黄色の命令ポインタを表示する。

これで、プログラムの状態を調べることができる。たとえば、Localsウィンドウ(Debug –> Windows –> Locals)を表示すると、現在のスコープにある変数の名前と値が示される。

組み込みのLocalsウィンドウはテキストのみを表示することに注意する。ここでImage Watchプラグインの出番となる。Image Watchはもう一つのLocalsウィンドウのようなものだが、画像ビューアが組み込まれている。Image Watchを表示するには、View –> Other Windows –> Image Watchを選択する。Visual StudioのLocalsウィンドウと同様に、Image WatchはVisual Studio IDEにドッキングできる。また、Visual StudioはImage Watchを開いていたかどうか、およびデバッグセッション間でどこに配置されていたかを記憶する。つまり、この操作は一度行えばよく、次回デバッグを開始したときには、Image Watchは前回の場所に戻っている。ブレークポイントにおけるドッキングされたImage Watchウィンドウは次のように見える。

左上のラジオボタン(Locals/Watch)は、その下のImage Listに何を表示するかを選択する。Localsは現在のスコープにあるすべてのOpenCV画像オブジェクトを一覧表示する(このリストは自動的に生成される)。Watchは、継続的な検査のためにピン留めされた画像式を表示する(ここでは説明しない。詳細はImage Watchのドキュメントを参照)。画像リストには、幅、高さ、チャンネル数、および利用可能であればサムネイルといった基本情報が表示される。この例では、画像リストには2つのローカル画像変数inputedgesが含まれている。

画像にサムネイルがある場合、その画像を左クリックすると、右側のImage Viewerでの詳細表示用に選択される。ビューアではパン(マウスのドラッグ)とズーム(マウスホイール)が可能である。また、現在のマウス位置のピクセル座標と値も表示する。

リストの2番目の画像edgesが「invalid」と表示されていることに注意する。これは、この画像オブジェクトの一部のデータメンバーが破損した、または無効な値(たとえば負の画像幅)を持っていることを示す。プログラムのこの時点ではこれは想定どおりであり、edgesのC++コンストラクタがまだ実行されておらず、そのメンバーが未定義の値を持っているためである(デバッグモードでは通常「0xCD」バイトで埋められる)。

ここからコードを1ステップずつ実行し(Debug->Step Over、またはF10を押す)、ピクセルの変化を観察できる。Mat edges;文を1ステップ実行すると、edges画像は「invalid」から「empty」に変化する。これは、まだ初期化されていない(たとえばcv::Mat::create()を使った初期化がされていない)ものの、有効な状態(デフォルトコンストラクトされた状態)になったことを意味する。cv::Canny()呼び出しをさらに1ステップ実行すると、エッジ画像のサムネイルが画像リストに現れる。

次に、cv::Canny()の実装を目視で確認したいとする。Image Listedges画像を選択してビューアに表示し、エッジが明確に定義された領域にズームインする。

Image Viewerを右クリックしてビューのコンテキストメニューを表示し、Link Viewsを有効にする(メニュー項目の横のチェックボックスでオプションが有効かどうかが示される)。

Link Views機能は、同じサイズの画像を切り替えるときにビュー領域を固定したまま保つ。この動作を確認するには、画像リストからinput画像を選択する。すると、input画像の対応するズームインされた領域が表示されるはずである。

また、上下のカーソルキーでinputとedgesの表示を行き来して切り替えることもできる。これにより、検出されたエッジがinput画像のデータときれいに一致しているかを簡単に確認できる。

さらに ...

Image Watchには、次のようなより高度な機能が多数ある。

  1. スコープをまたいだ検査やデバッグセッション間での検査のために、画像をWatchリストにピン留めする
  2. Watchウィンドウ内で直接、画像のクランプ、しきい値処理、差分の表示を行う
  3. メモリ上の画像をファイルから読み込んだ参照画像と比較する

詳細はオンラインのImage Watch Documentationを参照すること。Image Watchウィンドウ内のHelpリンクをクリックしてもドキュメントページにアクセスできる。