OpenCV-Pythonにおけるデータ構造【OpenCV】
OpenCVはC++でプログラムが書かれており、Python向けのラッパーを用いる際はデータ構造をPythonでのデータ構造に変換して考える必要があります。ここでは、OpenCVのAPIドキュメントに出てくるデータ構造がPythonでは何に相当するのかを解説します。
Pythonには汎用的な多次元配列を扱う数値演算ライブラリであるNumPyがあり、OpenCVにおける多次元配列(画像の画素情報など)はすべてNumPyのndarrayを用いるように対応しています。また、Pythonでは関数やクラスの戻り値として複数の値を定義することが可能であり、引数としても柔軟に設定することができることから、OpenCVにおいて座標を表すクラスなどはPythonでは定義されておらず、タプルとして表現することになっています。
[toc]
目次
基本データ構造
@ [APIドキュメント] ↑
- 関数の引数に指定する読み取り専用の配列を表します。
- 配列の実体は以下のいずれかによって作成されたものです。
- Mat, Mat_<T>, Matx<T, m, n>, vector<T>, vector<vector<T>>, vector<Mat>, vector<Mat_<T>>, UMat, vector<UMat>, double
- 関数の引数に_InputArray型を指定することで、Matだけでなく、vectorの値も引数に取れるようになり、関数の汎用性が上がる利点があります。
エイリアス
typedef const _InputArray InputArray;
Pythonにおける扱い
_OutputArrayクラス
@ [APIドキュメント] ↑
エイリアス
typedef const _OutputArray OutputArray;
typedef OutputArray OutputArrayOfArrays;
// _OutputArrayの配列を表す
// Pythonではndarrayのリストと解釈される
Pythonにおける扱い
Matクラス
@ [APIドキュメント] ↑
Pythonにおける扱い
Point_ クラス
@ [APIドキュメント] ↑
class Point_ <_Tp> | _Tp:X座標、Y座標を構成する数値の型 |
- X座標とY座標から成る2次元の座標を指定するテンプレートクラス
エイリアス
typedef Point_<double> Point2d;
typedef Point_<float> Point2f;
typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<int64> Point2l;
データメンバ
Pythonにおける扱い
- PythonではPoint_クラスは定義されておらず、タプルで (x, y) を与えて表現します。
- ただし、(x, y) のひとまとまりとして関数・メソッドの引数をみると理解しやすくなります。
- そこで、本サイトにおいては関数・メソッドのデータ型の記載に、あえてPoint_型を表す<Point>などを用います。
Rect_ クラス
@ [APIドキュメント] ↑
エイリアス
typedef Rect_<double> Rect2d;
typedef Rect_<float> Rect2f;
typedef Rect_<int> Rect2i;
typedef Rect2i Rect;
データメンバ
- x:矩形の左上のX座標 <_Tp>
- y:矩形の左上のY座標 <_Tp>
- width:矩形の幅 <_Tp>
- height:矩形の高さ <_Tp>
Pythonにおける扱い
- PythonではRect_クラスは定義されておらず、タプルで (x, y, width, height) を与えて表現します。
- ただし、(x, y, width, height) のひとまとまりとして関数・メソッドの引数をみると理解しやすくなります。
- そこで、本サイトにおいては関数・メソッドのデータ型の記載に、あえてRect_型を表す<Rect>などを用います。
RotatedRect クラス
@ [APIドキュメント] ↑
データメンバ
- center:矩形の重心座標(x, y) <Point2f>
- size:矩形のサイズ(width, height) <Size2f>
- width:angle=0°の時のX軸方向の長さ
- height:angle=0°の時のY軸方向の長さ
- angle:矩形の回転角度(度数法) <float>
Pythonにおける扱い
- PythonではRotatedRectクラスは定義されておらず、タプルで (center, size, angle) を与えて表現します。
- ただし、(center, size, angle) のひとまとまりとして関数・メソッドの引数をみると理解しやすくなります。
- そこで、本サイトにおいては関数・メソッドのデータ型の記載に、あえてRotatedRect型を表す<RotatedRect>を用います。
Scalar_ クラス
@ [APIドキュメント] ↑
- 4要素ベクトルを表すクラスで、画像のピクセル値を表すときに用いられる
エイリアス
typedef Scalar_<double> Scalar;
Pythonにおける扱い
- PythonではScalar_クラスは定義されておらず、タプルで(B, G, R, Alpha)、(B, G, R)などで表現します。
- ただし、(B, G, R, Alpha) などのひとまとまりとして関数・メソッドの引数をみると理解しやすくなります。
- そこで、本サイトにおいては関数・メソッドのデータ型の記載に、あえてScalar_型を表す<Scalar>などを用います。
Size_ クラス
@ [APIドキュメント] ↑
- 画像もしくは矩形のサイズを指定するテンプレートクラス
エリアス
typedef Size_<double> Size2d;
typedef Size_<float> Size2f;
typedef Size_<int> Size2i;
typedef Size2i Size;
typedef Size_<int64> Size2I;
データメンバ
- height:高さ <_Tp>
- width:幅 <_Tp>
Pythonにおける扱い
- PythonではSize_クラスは定義されておらず、タプルで(width, height)を与えて表現します。
- ただし、(width, height) などのひとまとまりとして関数・メソッドの引数をみると理解しやすくなります。
- そこで、本サイトにおいては関数・メソッドのデータ型の記載に、あえてSize_型を表す<Size>などを用います。
データ構造に準じた構造
Contour
@ ↑
- 複数の座標の集合から成り、特定の領域の輪郭を表すデータ構造です。
- 以下のような構造のデータテンソルとして与えられます。
- 第1軸 → サンプル軸
- 第2軸 → (-)
- 第3軸 → 座標(<Point>)
- データテンソルの形状は(Sample, 1, 2)となります。
- contourの中のn番目の点のX座標:contour[(n-1), 0, 0]
- contourの中のn番目の点のY座標:contour[(n-1), 0, 1]
- OpenCVではクラスとして定義されているわけではなくただ単に_InputArray クラスや_OutputArrayクラスとして扱われているだけですが、様々な関数で共通に用いられている構造になります。
Contourの例
- ここでは例として次の4つの座標がこの順番で含まれている輪郭(contour)を考えます
- (10, 10), (15, 10), (17, 16), (9, 20)
- この時、contourの形状は(4, 1, 2)となります
- contourの2番目の点はcontour[1, 0, :]となり(15,10)です。
- contourの3番目の点のX座標はcontour[2, 0, 0]となり17です。
Pythonにおける扱い
- PythonでもContour型は定義されておらず、ndarrayで表現します。
- ただし、このndarrayをひとまとまりとして関数・メソッドの引数をみると理解しやすくなります。
- そこで、本サイトにおいては関数・メソッドのデータ型の記載に、あえてContour型を表す<Contour>などを用います。
スポンサーリンク
コメント