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などのような定義もされています。
------
結論としては、色を使えば使うほど、精度を良くすればするほど、値が上がるってことです(アバウト~)。

0 件のコメント:

コメントを投稿