機能cv.findContours
輪郭、階層= cv.findContours(画像、モード、方法[オフセット]、輪郭[階層])
- パラメータ1:イメージソース
- パラメータ2:主なパラメータを説明するために、この記事の検索方法の概要
- パラメータ3:一般的な使用cv.CHAIN_APPROX_SIMPLE、それは少しのようにして、輪郭画素を表す意味します
- 輪郭:輪郭画像座標は、リンクされたリストであります
- 階層:[次、前、最初の子、親]、テキストで説明されています
私たちが渡されたときに、2つの番組検索方法(RetrievalModes)の概要パラメータ、プロファイルを探していることはcv.RETR_TREEあるとき私たちは、それはそれがどういう意味を表し、)(cv.findContoursを使うのか?また、この関数は任意の使用、それの価値の階層を返しますか?ここでは、これらの2つの問題を勉強しなければなりません。
理解コンターレベル
図のそれぞれ8人のプロフィール、2および2aの合計、及び内層の外側の輪郭は、図3および3aは同じです。図から参照してください。
- 0/1/2は、最も外側の輪郭輪郭で、我々は、彼らが同じアウトラインレベルにあると言うことができます:0
- 図2aは、一方2輪郭2aの父であり、サブ輪郭外形プロファイル2です。等高線レベルを数えるA:1
- 図3は、輪郭線3に、サブプロファイル2Aに類似している:クラス2
- 同様に、図3aは、サブ輪郭3であり、そしてそう............に
OpenCVの懸念が二つの概念ことである:子と同じアウトラインレベルの概要所属間。
我々は()関数は、階層の値を返すcv.findContoursを印刷する場合、それが含む4つの値の配列であることがわかります:[次に、前、最初の子、親]
次に:輪郭に同じレベルで、現在の輪郭
例2 =次に、同様に、輪郭1;次いで、2アウトラインそのため、0と同じレベルの次のプロファイル前の図は、1次= 1であり、?これは、次に= -1この時点で、同じレベルのプロファイルを低下させません。
前:同じレベルと輪郭上の現在の輪郭に
0 =前の1であるプロファイルに同一の前面と、1 =前プロファイル2、のため、輪郭部2aのためではなく、輪郭上ので、前= -1。
子まず第一スライバ現在の輪郭プロファイル
ようなプロファイル2として、最初のプロファイルは、最初の子= 2Aに、プロファイルストリップ2aのある輪郭3、最初の子= 3A。
親:親現在の輪郭形状
ようなプロファイル2aとは、親2、親= 2であり、プロファイル2は親輪郭を有していないので、親= -1。
OpenCVのは、以前のプロファイル番号が異なる話してい
今や我々は等高線のレベルの概念を理解していること、そして方法を探し同様のcv.RETR_TREEのアウトラインは、それが何を意味するのですか?
プロファイルする方法を探して
4つのプロファイル、それぞれ、以下を見て方法のRetrievalModesを見つけるOpenCVのがあります。
1. RETR_LIST
これは、アウトラインはすべて同じレベルに属している、それはアウトラインに属している子との間の関係を確立していない、見つけるための最も簡単な方法です。したがって、2つの値[最初の子、親]階層は-1です。例えば、同じチャート、我々はcv.RETR_LISTプロファイルを見つけるために使用しました:
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, 2)
print(hierarchy)
# 结果如下
[[[ 1 -1 -1 -1]
[ 2 0 -1 -1]
[ 3 1 -1 -1]
[ 4 2 -1 -1]
[ 5 3 -1 -1]
[ 6 4 -1 -1]
[ 7 5 -1 -1]
[-1 6 -1 -1]]]
いかなる従属関係がないので、0の輪郭が1であるように、1は2 ......
あなたは情報の階層構造を概説する必要がない場合は、その後、cv.RETR_LISTはより推奨、より良いパフォーマンス理由
2. RETR_TREE
cv.RETR_TREEは、我々が以前に使用されている方法ですが、それは階層的な従属の完全なプロファイルを確立する、それはすでに前に詳細に記載されています。
3. RETR_EXTERNAL
これだけで、アウトライン、最高レベルのを探して、それが唯一の私たちが3 0プロファイルと呼ぶものの目の前にあります。
入門講座RETR_EXTERNAL
contours, hierarchy = cv.findContours(thresh, cv.RETR_EXTERNAL, 2)
print(len(contours), hierarchy, sep='\n')
# 结果如下
3
[[[ 1 -1 -1 -1]
[ 2 0 -1 -1]
[-1 1 -1 -1]]]
実験結果
4. RETR_CCOMP
理解することがより困難コントラストcv.RETR_CCOMPでは、それはすべての輪郭は、2つのレベルに分け、ない外側層は内側の層です。コードと画像の組み合わせは、我々は次を理解することがあります:
入門講義RETR_CCOMP
contours, hierarchy = cv.findContours(thresh, cv.RETR_CCOMP, 2)
print(hierarchy)
# 结果如下
[[[ 1 -1 -1 -1]
[ 2 0 -1 -1]
[ 4 1 3 -1]
[-1 -1 -1 2]
[ 6 2 5 -1]
[-1 -1 -1 4]
[ 7 4 -1 -1]
[-1 6 -1 -1]]]
実験結果
以前のプロファイルは異なるシリアル番号を確認するには、このパラメータを使用します。
外側の輪郭を表すカッコ内の数字は、内層2は、輪郭を表します。例えば、1前プロファイル2は、次のページが4である、それは層3、= 3最初の子でプロファイルを有するが、外側輪郭自体は2つだけのレベル、親= -1からです。あなたは他人のために自分自身のプロフィールを確認することができます。
実験:画像の輪郭を描きます
import cv2 as cv
import numpy
# 1.读入图片
img = cv.imread('test_contours.jpg')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
contours, thresh = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
# 2.寻找轮廓
contours, hierarchy = cv.findContours(thresh, cv.RETR_LIST, 2)
print(len(contours),hierarchy)
# 3.绘制轮廓
cv.drawContours(img, contours, -1, (0, 0, 255), 2)
cv.imshow('result',img)
cv.waitKey(0)
cv.destroyAllWindows()