サーチ…
前書き
このトピックでは、OpenCVの基本的な構造について説明します。このトピックで説明する構造体は、 DataType
、 Point
、 Vec
、 Size
、 Rect
、 Scalar
、 Ptr
、 Mat
です。
データ・タイプ
OpenCVのプリミティブ型はunsigned char, bool, signed char, unsigned short, signed short, int, float, double
です。 OpenCVのデータ型はすべて、 CV_<bit-depth>{U|S|F}C(<number_of_channels>)
として定義されCV_<bit-depth>{U|S|F}C(<number_of_channels>)
ここで、 U: unsigned
、 S:signed
U: unsigned
、 F:floating point
です。
たとえば、 CV_32FC2
は32ビットの浮動小数点型の2チャネル構造です。基本的な1つのチャンネルタイプの定義は
#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
より高いチャネルを有する他のタイプは、以下の定義によってこれらから生成される。
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
これらのデータ型を使用すると、他の構造を作成することができます。
マット
Mat
(Matrix)は、RGB、HSVまたはグレースケール画像、実数または複素数値を持つベクトル、その他の行列など、さまざまな種類のデータを格納するために使用できるn次元配列です。
Mat
はwidth
、 height
、 type
、 channels
、 data
、 flags
、 data
datastart
、 data
dataend
などの情報を含んでいます。
いくつかのメソッドがあり、その中にはcreate
、 copyTo
、 convertTo
、 isContinious
などがあります。
Mat変数を作成するには多くの方法があります。私は100行、200列、CV_32FC3型の行列を作成したいと考えています:
int R = 100, C = 200;
Mat m1; m1.create(R,C,CV_32FC3);//creates empty matrix
Mat m2(cv::Size(R, C), CV_32FC3); // creates a matrix with R rows, C columns with data type T where R and C are integers,
Mat m3(R,C,CV_32FC3); // same as m2
マットの初期化:
Mat m1 = Mat::zeros(R,C,CV_32FC3); // This initialized to zeros, you can use one, eye or cv::randn etc.
Mat m2(R,C,CV_32FC3);
for (int i = 0; i < m2.rows; i++)
for (int j = 0; j < m2.cols; j++)
for (int k = 0; k < m2.channels(); k++)
m2.at<Vec3f>(i,j)[k] = 0;
//Note that, because m2 is a float type and has 3 channels, we used Vec3f, for more info see Vec
Mat m3(3, out, CV_32FC1, cv::Scalar(0));
Vec
Vec
(ベクトル)は数値のテンプレートクラスです。 c++ vector
とは異なり、一般に短いベクトル(少数の要素のみ)を格納します。
Vec
定義方法は次のとおりです。
typedef Vec<type, channels> Vec< channels>< one char for the type>;
typeはuchar, short, int, float, double
あり、それぞれの型の文字はそれぞれb, s, i, f, d
です。
たとえば、 Vec3b
は3チャネルの符号なしcharベクトルを示します。 RGBイメージの各インデックスはこの形式です。
Mat rgb = imread('path/to/file', CV_LOAD_IMAGE_COLOR);
cout << rgb.at<Vec3b>(0,0); //The output is [r g b] values as ASCII character.
// To print integer values of RED value
cout << (int)rgb.at<Vec3b>(0,0)[0]; //The output will be an integer in [0, 255].
Vec
クラスでは、以下の演算子が定義されています
v1 = v2 + v3
v1 = v2 - v3
v1 = v2 * scale
v1 = scale * v2
v1 = -v2
v1 += v2 and other augmenting operations
v1 == v2, v1 != v2