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

Prev Tutorial: 輪郭の特性
Next Tutorial: 輪郭の階層構造

目的

  • 凸性欠陥 (convexity defects) と、その求め方。
  • 点から多角形までの最短距離を求める
  • 異なる形状のマッチング

理論とコード

1. 凸性の欠陥 (Convexity Defects)

輪郭に関する第2章で凸包が何であるかを学んだ。物体のこの凸包からの逸脱はすべて凸性の欠陥とみなせる。これは画像を用いて可視化できる。開始点と終了点を結ぶ線を引き、最遠点に円を描く。

覚え書き
凸性欠陥を求めるには、凸包を求める際に returnPoints = False を渡す必要があることを忘れないように。

次の関数を使う: cv.convexityDefects (contour, convexhull, convexityDefect)

引数
contour入力輪郭。
convexhullconvexHull を用いて求めた凸包。輪郭点のうち凸包を構成する点のインデックスを含んでいる必要がある
convexityDefect凸性の欠陥を表す出力ベクトル。各凸性欠陥は4要素 (start_index, end_index, farthest_pt_index, fixpt_depth) で表される。ここで各インデックスは凸性欠陥の開始点・終了点・最遠点に対応する、元の輪郭における0始まりのインデックスであり、fixpt_depth は最遠の輪郭点と凸包との距離の固定小数点近似(8ビットの小数部を持つ)である。すなわち、欠陥の深さの浮動小数点値を得るには fixpt_depth/256.0 とする。

試してみよう

2. 点と多角形の判定 (Point Polygon Test)

この関数は、画像内の点と輪郭の間の最短距離を求める。点が輪郭の外側にあるときは負、内側にあるときは正、輪郭上にあるときは0となる距離を返す。

次の関数を使う: cv.pointPolygonTest (contour, pt, measureDist)

引数
contour入力輪郭。
pt輪郭に対して判定する点。
measureDisttrue の場合、関数は点から最も近い輪郭エッジまでの符号付き距離を推定する。それ以外の場合は、点が輪郭の内側にあるかどうかのみを判定する。
let dist = cv.pointPolygonTest(cnt, new cv.Point(50, 50), true);

3. 形状のマッチング (Match Shapes)

OpenCVには2つの形状、または2つの輪郭を比較し、類似度を示す指標を返す関数 cv.matchShapes() がある。結果が小さいほどマッチングが良好である。これはhuモーメント値に基づいて計算される。さまざまな測定方法についてはドキュメントで説明されている。

次の関数を使う: cv.matchShapes (contour1, contour2, method, parameter)

引数
contour11つ目の輪郭またはグレースケール画像。
contour22つ目の輪郭またはグレースケール画像。
method比較手法。cv::ShapeMatchModes を参照
parameter手法固有の引数(現在は未サポート)。

試してみよう