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

次のチュートリアル: 輪郭の特徴

目的

輪郭とは何か?

輪郭は、同じ色または強度を持つ(境界に沿った)連続した点をすべて結んだ曲線として簡単に説明できる。輪郭は形状解析や物体検出・認識に役立つツールである。

  • より高い精度を得るには、二値画像を使用する。そのため、輪郭を見つける前にしきい値処理やCannyエッジ検出を適用する。
  • OpenCV 3.2 以降、入力画像はこの関数によって変更されない。
  • OpenCVでは、輪郭を見つけることは黒い背景から白い物体を見つけることに似ている。したがって、見つけたい物体は白く、背景は黒であるべきだという点を覚えておくこと。

輪郭を描画するには?

輪郭を描画するには、cv.drawContours 関数を使用する。境界点が分かっていれば、任意の形状を描画するためにも使用できる。

次の関数を使用する: cv.findContours (image, contours, hierarchy, mode, method, offset = new cv.Point(0, 0))

引数
image入力画像。8ビットのシングルチャンネル画像。非ゼロのピクセルは1として扱われる。ゼロのピクセルは0のまま残るため、画像は2値として扱われる。
contours検出された輪郭。
hierarchy画像のトポロジに関する情報を格納する。輪郭の数と同じ数の要素を持つ。
mode輪郭の取得モード(cv.RetrievalModes を参照)。
method輪郭の近似手法(cv.ContourApproximationModes を参照)。
offset各輪郭点をシフトする省略可能なオフセット。輪郭を画像のROIから抽出し、その後それらを画像全体の文脈で解析する場合に有用である。

cv.drawContours (image, contours, contourIdx, color, thickness = 1, lineType = cv.LINE_8, hierarchy = new cv.Mat(), maxLevel = INT_MAX, offset = new cv.Point(0, 0))

引数
image出力画像。
contoursすべての入力輪郭。
contourIdx描画する輪郭を示す引数。負の値の場合、すべての輪郭が描画される。
color輪郭の色。
thickness輪郭を描画する線の太さ。負の値の場合、輪郭の内部が塗りつぶされる。
lineType線の連結性(cv.LineTypes を参照)。
hierarchy階層に関する省略可能な情報。一部の輪郭だけを描画したい場合にのみ必要となる(maxLevelを参照)。
maxLevel描画する輪郭の最大レベル。0の場合、指定した輪郭のみが描画される。1の場合、輪郭とそのすべての入れ子になった輪郭が描画される。2の場合、輪郭、すべての入れ子になった輪郭、さらにその入れ子になった輪郭、というように描画される。この引数は、利用可能な階層がある場合にのみ考慮される。
offset省略可能な輪郭シフト引数。

試してみよう

輪郭の近似手法

これは cv.findContours 関数の5番目の引数である。実際には何を表しているのだろうか?

先ほど、輪郭は同じ強度を持つ形状の境界であると述べた。輪郭は形状の境界の(x,y)座標を格納する。しかし、すべての座標を格納するのだろうか?それを指定するのがこの輪郭の近似手法である。

cv.ContourApproximationModes.CHAIN_APPROX_NONE.value を渡すと、すべての境界点が保存される。しかし実際にすべての点が必要だろうか? 例えば、直線の輪郭を求めたとする。その直線を表現するのに線上のすべての点が必要だろうか? いや、必要なのは線の両端の2点だけである。これが cv.CHAIN_APPROX_SIMPLE が行うことである。冗長な点をすべて取り除いて輪郭を圧縮し、メモリを節約する。