![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
前のチュートリアル: 輪郭: はじめに
次のチュートリアル: 輪郭の特性
画像モーメントは、物体の重心や面積など、いくつかの特徴を計算するのに役立つ。画像モーメント に関するWikipediaのページを参照のこと。
次の関数を使用する: cv.moments (array, binaryImage = false)
| array | ラスタ画像(シングルチャンネルの 8 ビットまたは浮動小数点の2次元配列)、もしくは2次元の点の配列( 1×N または N×1 )。 |
| binaryImage | true の場合、すべての非ゼロの画像ピクセルが 1 として扱われる。この引数は画像に対してのみ使用される。 |
このモーメントから、面積や重心などの有用なデータを抽出できる。重心は次の関係式で与えられる: \(C_x = \frac{M_{10}}{M_{00}}\) および \(C_y = \frac{M_{01}}{M_{00}}\)。これは次のように行える:
輪郭の面積は、関数 cv.contourArea() によって、またはモーメント M['m00'] から得られる。
次の関数を使用する: cv.contourArea (contour, oriented = false)
| contour | 入力となる2次元の点(輪郭の頂点)のベクトル |
| oriented | 符号付き面積フラグ。true の場合、関数は輪郭の向き(時計回りまたは反時計回り)に応じた符号付きの面積値を返す。この機能を使えば、面積の符号を見ることで輪郭の向きを判定できる。デフォルトではこの引数は false であり、絶対値が返されることを意味する。 |
これは弧長とも呼ばれる。cv.arcLength() 関数を使って求めることができる。
次の関数を使用する: cv.arcLength (curve, closed)
| curve | 入力となる2次元の点のベクトル。 |
| closed | 曲線が閉じているかどうかを示すフラグ。 |
指定した精度に応じて、輪郭の形状をより少ない頂点数の別の形状に近似する。これは Douglas-Peuckerアルゴリズム の実装である。アルゴリズムとデモについてはWikipediaのページを参照のこと。
次の関数を使用する: cv.approxPolyDP (curve, approxCurve, epsilon, closed)
| curve | cv.Mat に格納された2次元の点の入力ベクトル。 |
| approxCurve | 近似の結果。型は入力曲線の型と一致している必要がある。 |
| epsilon | 近似の精度を指定する引数。これは元の曲線とその近似との間の最大距離である。 |
| closed | true の場合、近似された曲線は閉曲線となる(最初と最後の頂点が接続される)。そうでない場合は閉じない。 |
凸包は輪郭の近似に似て見えるが、実際には異なる(場合によっては両者が同じ結果を与えることもある)。ここでは、cv.convexHull() 関数が曲線の凸性の欠陥を調べて補正する。一般に、凸曲線とは常に外側に膨らんでいるか、少なくとも平坦な曲線のことである。そして内側に膨らんでいる場合、それは凸性の欠陥と呼ばれる。例として、下の手の画像を見てほしい。赤い線は手の凸包を示している。両矢印の印は凸性の欠陥を示しており、これは凸包から輪郭への局所的な最大の偏差である。
次の関数を使用する: cv.convexHull (points, hull, clockwise = false, returnPoints = true)
| points | 入力となる2次元の点集合。 |
| hull | 出力される凸包。 |
| clockwise | 向きフラグ。true の場合、出力される凸包は時計回りの向きになる。それ以外の場合は反時計回りの向きになる。想定される座標系では、X 軸は右方向、Y 軸は上方向を向いている。 |
| returnPoints | 動作フラグ。行列の場合、フラグが true のとき、関数は凸包の点を返す。それ以外の場合は、凸包の点のインデックスを返す。 |
曲線が凸かどうかをチェックする関数 cv.isContourConvex() がある。これは True か False を返すだけである。たいしたことはない。
バウンディング矩形には2種類ある。
これは軸に平行な矩形で、物体の回転を考慮しない。そのため、バウンディング矩形の面積は最小にはならない。
次の関数を使用する: cv.boundingRect (points)
| points | 入力となる2次元の点集合。 |
ここでは、バウンディング矩形は面積が最小になるように描かれるため、回転も考慮される。
次の関数を使用する: cv.minAreaRect (points)
| points | 入力となる2次元の点集合。 |
次に、関数 cv.minEnclosingCircle() を使って物体の外接円を求める。これは物体を完全に覆う最小面積の円である。
次の関数を使用する: cv.minEnclosingCircle (points)
| points | 入力となる2次元の点集合。 |
cv.circle (img, center, radius, color, thickness = 1, lineType = cv.LINE_8, shift = 0)
| img | 円が描画される画像。 |
| center | 円の中心。 |
| radius | 円の半径。 |
| color | 円の色。 |
| thickness | 円の輪郭線の太さ(正の値の場合)。負の太さは、塗りつぶされた円を描画することを意味する。 |
| lineType | 円の境界の種類。 |
| shift | 中心の座標および半径の値における小数部のビット数。 |
次は物体に楕円をフィッティングすることである。これは楕円が内接する回転矩形を返す。次の関数を使用する: cv.fitEllipse (points)
| points | 入力となる2次元の点集合。 |
cv.ellipse1 (img, box, color, thickness = 1, lineType = cv.LINE_8)
| img | 画像。 |
| box | RotatedRect による楕円の別表現。これは、関数が回転した矩形に内接する楕円を描画することを意味する。 |
| color | 楕円の色。 |
| thickness | 楕円弧の輪郭線の太さ(正の値の場合)。それ以外の場合は、塗りつぶされた楕円のセクタを描画することを示す。 |
| lineType | 楕円の境界の種類。 |
同様に、点の集合に直線をフィッティングできる。これに直線を近似できる。
次の関数を使用する: cv.fitLine (points, line, distType, param, reps, aeps)
| points | 入力となる2次元の点集合。 |
| line | 出力される直線のパラメータ。4 要素 [vx, vy, x0, y0] の Mat である必要がある。ここで [vx, vy] は直線に共線な正規化されたベクトルであり、[x0, y0] は直線上の点である。 |
| distType | M 推定量が用いる距離(cv.DistanceTypes を参照)。 |
| param | 一部の距離の種類で用いられる数値パラメータ ( C )。0 の場合は最適な値が選択される。 |
| reps | 半径(座標原点と直線との間の距離)に対する十分な精度。 |
| aeps | 角度の十分な精度。reps と aeps には 0.01 が良いデフォルト値となる。 |
cv.line (img, pt1, pt2, color, thickness = 1, lineType = cv.LINE_8, shift = 0)
| img | 画像。 |
| pt1 | 線分の第1の点。 |
| pt2 | 線分の第2の点。 |
| color | 線の色。 |
| thickness | 線の太さ。 |
| lineType | 線の種類。 |
| shift | 点座標における小数部のビット数。 |