Visual Studio 2013で、OpenCVのプログラムをデバッグするときの小ネタ。覚書き。
課題
3x3 の単位行列を出力する OpenCV のプログラム(実質2行)を書いてみる。
#include <iostream>
#include <opencv/core.hpp>
int main(void)
{
cv::Mat eye = cv::Mat::eye(3,3,CV_32FC1);
std::cout << eye << std::endl;
return 0;
}
実行するとこんな感じ。
Visual Studio 2013 の デバッガー から、変数 eye
の中身を見たい。
しかし、ローカル変数のウィンドウでは、こんな風に 0 '\0'
と表示されてしまう。
デバッガーはOpenCVの型情報を解釈できないので、仕方なし。
メモリウィンドウで覗いても良いのですが、カラム数など毎回設定するのは面倒。
どうしたら、cv::Mat の中身を 3x3 の行列として、簡単に見られるのか?
ヒント:ウォッチ式でキャストを使う。
解1
cv::Mat.data
を 3 要素の1次元 float
配列にキャストし、それを3行分表示する。
ウォッチ式: (float (*)[3]) eye.data, 3
『 , n 』で修飾すると n 個分のデータを表示してくれる ナイス機能を利用。
- 関連する StackOverflow の記事
解2
cv::Mat.data
を 3x3 要素の2次元 float
配列にキャストして表示する。
ウォッチ式: (float (*)[3][3]) eye.data
こちらの方が素直ですかね!
型は float [3][3] *
という風にポインタ扱いになる模様。
同じ手は、3次元配列にも通用します。
まとめ
ウォッチ式でキャストを工夫すると、Continuous な cv::Mat の中身を簡単に確認することができる。
おわり。