輪郭の検出と描画

輪郭の検出と描画

1) コンターとは

輪郭は、同じ色またはグレースケールで、連続する点を接続する(境界を接続する)曲線と単純に考えることができ、輪郭を抽出することは抽出することです

同じ色またはグレースケール、または接続されたドメイン、等高線を持つこれらの曲線は、形状分析およびオブジェクトの検出と認識に非常に役立ちます。
予防:

①より正確にするために、2値化された画像を使用する必要があります。輪郭を探す前に、しきい値処理またはキャニー境界検出が実行されます

②輪郭を見つける機能は、元の画像を修正します。輪郭を見つけた後も元の画像を使用したい場合は、元の画像を他の変数に保存する必要があります

中img.copy()

③OpenCV では、輪郭を見つけることは、黒い背景で白いオブジェクトを見つけるようなものです。探しているオブジェクトは白で、背景は黒でなければならないことに注意してください。

一般的に使用される関数: cv2.findContours()-----輪郭を見つける cv2.drawContours()-----輪郭を描く

ここに画像の説明を挿入
輪郭を見つける — cv2.findContours()
ここに画像の説明を挿入
⚫image: 入力画像、8 ビットのシングルチャンネル画像 (通常はバイナリ画像) ⚫contours: 検出された輪郭、各輪郭は Point
のベクトル表現であるポイント ベクトルとして格納されます
⚫ 階層: 画像のトポロジ情報を含むオプションの出力ベクトル。等高線の数の表現として、多くの要素を含んでおり、各等高線のcontours[i]は、hierarchy[i][0]~hierarchy[i][3]の4つの階層要素に対応し、それぞれ次の等高線、前の等高線を表しています。輪郭, 親輪郭と埋め込まれた輪郭のインデックス番号, 対応する項目がない場合, 負の数に設定
⚫mode: 輪郭検索モード, 値は次のとおりです:
cv2.RETR_EXTERNAL=0-----最も外側の輪郭のみが検出されたことを示します cv2.RETR_LIST= 1------すべての輪郭を抽出してリストに配置します。輪郭は階層関係を確立しません cv2.RETR_CCOMP=2------すべてを抽出しますcv2.RETR_TREE =3---- -- すべての輪郭を抽出し、メッシュの輪郭構造を再構築する
⚫method: 輪郭の近似方法。値については図 2 を参照
⚫offset:各輪郭のオプションのオフセット。デフォルト値は Point()

ここに画像の説明を挿入
CV_CHAIN APPROX NONE すべての輪郭点を連続して保存します。隣接する 2 つの点は、水平、垂直、または斜めです。つまり

max(bs(x1-x2),ab (y2-y1))==1.

·CV CHAIN APPROXSIMPLE 圧縮ストレージ、水平、垂直、または斜めの線分について、終点のみが保存されます。たとえば、四角形の場合のみ

4 つの頂点を格納します。

CHAIN APPROXTC89L1、CV_CHAIN QPPROXTC89KCOS は、Teh-Chin チェーン近似アルゴリズムの 1 つを使用します。

LINK RUNS は、上記のアルゴリズムとはまったく異なり、水平階層のすべての輪郭をリンクします。

contours, hierarchy = cv2.findContours (mask, CV2.RETR EXTERNAL, CV2.CHAIN APPROX SIMPIE)

thresh,contours,hierarchy = cv2.findContours(thresh, CV2.RETR TREE,CV2.CHAIN APPROX SIMPIE)

輪郭を描く — cv2.drawContours()

ここに画像の説明を挿入

⚫image: 目标图像, Mat类型对象即可
⚫contours: 所有的输入轮廓, 每个轮廓存储为一个点向量
⚫contourIdx: 轮廓绘制指示变量(索引), 若为负值, 则表示绘制所有轮廓
⚫color: 绘制轮廓的颜色
⚫thickness: 轮廓线条的粗细, 默认值1, 如果为负值, 则绘制轮廓内部, 可选宏 CV_FILLED
⚫lineType: 线条类型, 默认值8
⚫hierarcy: 可选的层次结构信息, 默认值noArray()
⚫maxLevel: 表示用于绘制轮廓的最大等级, 默认值INT_MAX
⚫offset: 可选的轮廓偏移参数, 默认值Point()
cv2.drawContours(img1, contours,-1, (0,0,255)2)

ここに画像の説明を挿入

2) 各輪郭へのアクセス方法

for i in range (0,len (contours)) :
  #cv2.drawContours (img,contours[i],-1,(0,255,0) ,5)
   cv2 .drawContours (img,contours ,i,(0,255,0) ,5)
for cnt in contours:
    cv2.drawContours (img,cnt,-1, (0,255,0) ,5)

3) 各輪郭のすべてのポイントにアクセスする方法

for i in range (0,len (contours)) :
    for j in range (0,len (contours[il)) :
       cv2.drawContours(img,contours[il,j,(0,255,0) ,3)
for cnt in contours:
    for j in range(0,len (cnt)) :
         cv2 .drawContours (img,cnt,j,(0,255,0) ,3)

len(contours)------すべての輪郭の数
len(contours[i])------ i 番目の輪郭のすべての点の数
ここに画像の説明を挿入

4) 輪郭収納構造

mode: 輪郭検索モード、値は次のとおりです CV2.RETR EXTERNAL=0-----最も外側の輪郭のみを検出することを示します
Cv2.RETR LIST=1------すべての輪郭を抽出して配置します階層関係を確立する
cv2.RETR CCOMP=2------すべての輪郭を抽出し、2 層構造に整理する
CV2.RETR TREE =3------すべてを抽出する輪郭を描き、メッシュの輪郭構造を再構築します

おすすめ

転載: blog.csdn.net/weixin_40911806/article/details/130053518