LoginSignup
5
10

More than 5 years have passed since last update.

Visual Studio の Image Watch プラグインで std::vector を使う

Posted at

概要

画像処理プログラミングをする際の超便利なプラグインとして、デバッグ中のメモリを画像表示してくれる Image Watch プラグインがあります。

Image Watch プラグイン
alt

このプラグインはデフォルトで OpenCV の Mat や IplImage を表示してくれますが、
カスタム Visualizer ファイルを作成することで自作クラスを画像表示に対応させることもできます。

この記事では std::vector を使った自作画像クラスの Visualizer の作成法について解説します。
Visual Studio のバージョンは 2015 です。

方法

画像表示させたいクラスがこんな感じだとします。

class MyImage
{
  //! 幅
  int width;

  //! 高さ
  int height;

  //! 画素データ
  std::vector<int> rgbData;
};

メンバ変数 rgbData の各要素 (4バイト) には、先頭3バイトに BGR の順番で色情報が入っていて、4バイト目は使用されない仕様です。

このクラスの画像表示をするためには、このクラスに対応した Visualizer ファイルというものを作成し、所定の場所に保存する必要があります。

Visualizer ファイルの作成

Visual Studio 2015 をインストール済みであればログイン中のユーザのドキュメントフォルダ下に Visual Studio 2015\Visualizers というフォルダが作成されているかと思います。まずそれを開きます。

[ユーザプロファイル]\Documents\Visual Studio 2015\Visualizers

このフォルダに新規ファイルを追加します。ファイル名はなんでもよいですが例えば "myImage" にします。拡張子は必ず ".natvis" にします。

Visualizer ファイルの編集

メモ帳で "myImage.natvis" を開いて以下のように編集します。

myImage.natvis
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" MenuName="Add to Image Watch"/>

  <!-- MyImage def -->
  <Type Name="MyImage">
    <UIVisualizer ServiceId="{A452AFEA-3DF6-46BB-9177-C0B08F318025}" Id="1" />
  </Type>

  <Type Name="MyImage">
    <Expand>
      <Synthetic Name="[type]">
        <DisplayString>UINT8</DisplayString>
      </Synthetic>
      <Synthetic Name="[channels]">
        <DisplayString>RGB</DisplayString>
      </Synthetic>
      <Item Name="[width]">width</Item>
      <Item Name="[height]">height</Item>
      <!-- buffer address of std::vector -->
      <Item Name="[data]">((rgbData._Mypair)._Myval2)._Myfirst</Item>
      <Item Name="[stride]">4*width</Item>
    </Expand>
  </Type>

</AutoVisualizer>
  • Type タグの Name には自作クラス名 (MyImage) を書きます。
  • type 属性には1チャンネルのとる値の範囲を入れます(たぶん)。この場合 0-255 なので UINT8 にします。
  • channels 属性にはチャンネル数を入れます。この場合 RGB です(もしくは 3 でも大丈夫です)。
  • width, height 属性には画像の幅、高さを保存しているメンバ変数名を入れます
  • stride 属性には画像一行のバイト数を入れます。この場合 width x 4 バイトです(4 は sizeof(int) から)。
  • data 属性には画像のバッファの先頭ポインタを指定します。 &rgbData[0] と書きたくなりますがこの書き方は Visualizer では解釈しれくれないので ((rgbData._Mypair)._Myval2)._Myfirst と書き下す必要がありました。

myImage.natvis を上記の形で保存して Visual Studio を再起動するとデバッグ中にメモリの状態を画像として確認できるようになります。Image Watch ウィンドウの表示は「表示」メニューからできます。

テンプレートクラスの画像表示など全般的な使い方は Image Watch Help に書かれています。

5
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
10