OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
輪郭の特徴

前のチュートリアル: 輪郭: はじめに
次のチュートリアル: 輪郭の特性

目的

  • 面積、周囲長、重心、バウンディングボックスなど、輪郭のさまざまな特徴を求める
  • 輪郭に関連する多くの関数を学ぶ。

1. モーメント

画像モーメントは、物体の重心や面積など、いくつかの特徴を計算するのに役立つ。画像モーメント に関するWikipediaのページを参照のこと。

次の関数を使用する: cv.moments (array, binaryImage = false)

引数
arrayラスタ画像(シングルチャンネルの 8 ビットまたは浮動小数点の2次元配列)、もしくは2次元の点の配列( 1×N または N×1 )。
binaryImagetrue の場合、すべての非ゼロの画像ピクセルが 1 として扱われる。この引数は画像に対してのみ使用される。

試してみよう

このモーメントから、面積や重心などの有用なデータを抽出できる。重心は次の関係式で与えられる: \(C_x = \frac{M_{10}}{M_{00}}\) および \(C_y = \frac{M_{01}}{M_{00}}\)。これは次のように行える:

let cx = M.m10/M.m00
let cy = M.m01/M.m00

2. 輪郭の面積

輪郭の面積は cv.contourArea() 関数で求められるか、モーメントから M['m00'] として求められる。

次の関数を使用する: cv.contourArea (contour, oriented = false)

引数
contour入力となる2次元の点(輪郭の頂点)のベクトル
oriented符号付き面積フラグ。true の場合、関数は輪郭の向き(時計回りまたは反時計回り)に応じた符号付きの面積値を返す。この機能を使えば、面積の符号を見ることで輪郭の向きを判定できる。デフォルトではこの引数は false であり、絶対値が返されることを意味する。

試してみよう

3. 輪郭の周囲長

弧長とも呼ばれる。cv.arcLength() 関数を使って求められる。

次の関数を使用する: cv.arcLength (curve, closed)

引数
curve入力となる2次元の点のベクトル。
closed曲線が閉じているかどうかを示すフラグ。

試してみよう

4. 輪郭の近似

指定した精度に応じて、輪郭の形状をより少ない頂点数の別の形状に近似する。これは Douglas-Peuckerアルゴリズム の実装である。アルゴリズムとデモについてはWikipediaのページを参照のこと。

次の関数を使用する: cv.approxPolyDP (curve, approxCurve, epsilon, closed)

引数
curvecv.Mat に格納された2D点の入力ベクトル。
approxCurve近似の結果。型は入力曲線の型と一致している必要がある。
epsilon近似の精度を指定する引数。これは元の曲線とその近似との間の最大距離である。
closedtrue の場合、近似された曲線は閉曲線となる(最初と最後の頂点が接続される)。そうでない場合は閉じない。

試してみよう

5. 凸包

凸包は輪郭の近似と似ているように見えるが、別物である(場合によっては同じ結果になることもある)。ここで cv.convexHull() 関数は曲線の凸性の欠陥を調べ、それを補正する。一般的に言えば、凸曲線とは常に外側に膨らんでいる、あるいは少なくとも平坦な曲線である。そして内側に膨らんでいる場合、それは凸性の欠陥(convexity defects)と呼ばれる。例として、下の手の画像を見てほしい。赤い線が手の凸包を示している。両矢印の印が凸性の欠陥を示しており、これは凸包から輪郭への局所的な最大のずれである。

image

次の関数を使用する: cv.convexHull (points, hull, clockwise = false, returnPoints = true)

引数
points入力となる2次元の点集合。
hull出力される凸包。
clockwise向きフラグ。true の場合、出力される凸包は時計回りの向きになる。それ以外の場合は反時計回りの向きになる。想定される座標系では、X 軸は右方向、Y 軸は上方向を向いている。
returnPoints動作フラグ。行列の場合、フラグが true のとき、関数は凸包の点を返す。それ以外の場合は、凸包の点のインデックスを返す。

試してみよう

6. 凸性のチェック

曲線が凸かどうかをチェックする関数として cv.isContourConvex() がある。TrueかFalseを返すだけで、大したことはない。

cv.isContourConvex(cnt);

7. バウンディング矩形

バウンディング矩形には2種類ある。

7.a. 軸に平行なバウンディング矩形

これは軸に平行な矩形で、物体の回転を考慮しない。そのため、バウンディング矩形の面積は最小にはならない。

次の関数を使用する: cv.boundingRect (points)

引数
points入力となる2次元の点集合。

試してみよう

7.b. 回転した矩形

ここでは、バウンディング矩形は面積が最小になるように描かれるため、回転も考慮される。

次の関数を使用する: cv.minAreaRect (points)

引数
points入力となる2次元の点集合。

試してみよう

8. 最小外接円

次に 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中心の座標および半径の値における小数部のビット数。

試してみよう

9. 楕円のフィッティング

次はオブジェクトに楕円をフィッティングする。楕円が内接する回転矩形を返す。次の関数を使用する: cv.fitEllipse (points)

引数
points入力となる2次元の点集合。

cv.ellipse1 (img, box, color, thickness = 1, lineType = cv.LINE_8)

引数
img画像。
boxRotatedRect による楕円の別表現。これは、関数が回転した矩形に内接する楕円を描画することを意味する。
color楕円の色。
thickness楕円弧の輪郭線の太さ(正の値の場合)。それ以外の場合は、塗りつぶされた楕円のセクタを描画することを示す。
lineType楕円の境界の種類。

試してみよう

10. 直線のフィッティング

同様に、点の集合に直線をフィッティングできる。これに直線を近似できる。

次の関数を使用する: cv.fitLine (points, line, distType, param, reps, aeps)

引数
points入力となる2次元の点集合。
line出力される直線のパラメータ。4 要素 [vx, vy, x0, y0] の Mat である必要がある。ここで [vx, vy] は直線に共線な正規化されたベクトルであり、[x0, y0] は直線上の点である。
distTypeM推定量で使用される距離(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点座標における小数部のビット数。

試してみる