2010年6月22日火曜日

Digiclops+OpenCVその2

CV_MAT_CNって何?

cxtypes.hに定義されていました。
-----
#define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
-----
CV_MAT_CN_MASK?
-----
#define CV_MAT_CN_MASK ((CV_CN_MAX - 1) << CV_CN_SHIFT)
-----
CV_CN_MAX? CV_CN_SHIFT?
-----
#define CV_CN_MAX 64
#define CV_CN_SHIFT 3
-----
ということは、CV_MAT_CN_MASKは
-----
#define CV_MAT_CN_MASK ((64 - 1) << 3)
つまり
#define CV_MAT_CN_MASK ((63) << 3)
ということは「00111111」を3ビット左シフトなので「1 11111000」。
-----
従って、CV_MAT_CNは、
-----
#define CV_MAT_CN(flags) ((((flags) & 1 11111000) >> 3) + 1)
-----
ということです。flagsの値にマスクをかけて3ビット右シフトして1を足すということでね(なんのこっちゃ)。ここでflagsにはCvMat型のtype属性が多いので、それを確認。こちらはファイルには何も説明が載っていなかったので、リファレンスを確認。
-----
typedef struct CvMat
{
int type; /* CvMat シグネチャ (CV_MAT_MAGIC_VAL).要素の型とフラグ */
(略)
}
-----
このtypeは、CV_8UやCV_16Uなどの型。ファイルには、
#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
#define CV_USRTYPE1 7
と定義されています。つまり大きなデータを使うと数字があがっていくわけですね。さらに、CV_16UC3などのような定義もされています。
------
結論としては、色を使えば使うほど、精度を良くすればするほど、値が上がるってことです(アバウト~)。

2010年6月9日水曜日

Digiclops+OpenCVその1

Digiclopsで取得した画像をOpenCVで扱う際にとても苦労した。
Digiclops(Triclops)から得られる画像はカラー画像と思い、

CvSize imageSize = cvSize(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT);
image = cvCreateImage(imageSize, IPL_DEPTH_8U,3);

とチャンネル3の画像で受け取り表示したのが、そもそもの間違い。ここでエラーを出してくれればいいものの(勝手です、はい・・・)、このままでウインドウに表示されるのです。何の疑いもなくそのままプログラミングを続けていったら、cvCopyやcvCvtColorなどの関数でエラーが連発し撃沈。

得に、ハフ変換などして線分を抽出した後に線分の色を赤にして元画像に埋め込んだりする時にどうしてもエラーの内容が分からず彷徨う結果に・・・。

つまり、カメラからの画像は、

CvSize imageSize = cvSize(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT);
image = cvCreateImage(imageSize, IPL_DEPTH_8U,1);

で受けて、そのあと、

cvCvtColor(image, show_image, CV_GRAY2RGB);

とRGBに変換して

cvShowImage("ウインドウ名前", show_image);

とすれば一見落着。プログラムが大きかったので原因を突き止めて解決するまで半日を要しました。(-.-)ふ~

とりあえず無意味なハフ変換を載せておきます。