findContours関数の詳細な分析

1: image, cnts, hierarchy = cv2.findContours(a,b,c)//寻找图形中的轮廓
传入的参数:
	a:传入的图像(二值化图像)
	b:轮廓的检索模式,一般是检测外轮廓cv2.RETR_EXTERNAL
	c:轮廓的近似方法有两种:(近似都是用近似矩形的方法,c不同的取值只是存储近似矩形的方法不同)
		①CV_CHAIN_APPROX_SIMPLE:
		一般是保留轮廓的终点坐标:近似矩形的左上角顶点坐标以及宽和高(x,y,w,h):
		②CV_CHAIN_APPROX_NONE:
		存储所有的轮廓点,相邻的两个点的像素位置差不超过1
函数返回值:
	image:处理过的图像(就是原本的图像,findcontous函数不改变你传入的图像)
	cnts:轮廓的点集列表,下文细说
	hierarchy:轮廓的层次结构,下文细说

Cnts 解析:
cnts は、見つかった輪郭の点セットの集合を表します。これは、numpy のリスト構造です。次のように、画像内の各輪郭を格納する配列として考えることもできます。

a = np.size(cnts) //a就是图像中所有轮廓的数量。

cnts[i] //表示拿出图象中第i个轮廓。至于一个图像中那么多轮廓的索引如何规定,那是计算机的事情

この配列の各位置には、画像内の画像の小さな部分が格納されているだけです (前述したように、輪郭を描画すると全体の画像の一部しか描画されないため、輪郭はほぼ長方形に描画されてから cnts になります)。 「配列」内の各位置には、長方形で囲まれた画像の座標が格納されます。例:
ここに画像の説明を挿入
(findContours は輪郭の検索のみに使用され、輪郭の描画には使用されないことに注意してください。輪郭の描画はdrawContours 関数ですが、draw 関数は find 関数に基づいて描画します。) この図には 10 個の輪郭が描画されているため、cnt のストレージは次のようになります

ここに画像の説明を挿入
図からわかるように、cnts には 10 個の「要素」が格納されており、各「要素」は輪郭で囲まれた画像の座標です

階層解析(cntほど重要ではありません)
階層は輪郭間の階層関係を保存します. 階層はN*Mサイズの行列であり、Nは輪郭の数であり、Mは4に固定されます。好き:

[[[ 1 -1 -1 -1] #轮廓0

[ 4 0 2 -1] #轮廓1

[-1 -1 3 1] #轮廓2

[-1 -1 -1 2] #轮廓3

[-1 1 -1 -1]]] #轮廓4

このデータから、これらは 5 つの輪郭であり、それぞれに独自の階層関係があり、[a,b,c,d] として表現できることがわかります。 a: は、次の輪郭の番号を示します
。同じレベルの輪郭、次のものを使用しない場合、a=-1

b: 同じレベルの輪郭の前の輪郭の番号を示します。前の輪郭がない場合、b=-1

c: 輪郭に含まれる次のレベルの輪郭の最初の番号を示します。そうでない場合は、c = -1

d: この輪郭の上位レベルの輪郭の番号を示します。そうでない場合は、d = -1

各輪郭の番号はコンピューターによって割り当てられ(今ではこのように理解しています)、割り当て後、各輪郭の対応する階層行列を取得できます。

輪郭 0、次の兄弟の数は 1、最初のパラメータは 1、このレベルでは最初であるため、2 番目のパラメータは -1、サブ輪郭が含まれていないため、3 番目のパラメータは -1 です。 ;これは最初のレベルにあるため、他のレベルに属さないため、4 番目のパラメータは -1 になります。

輪郭 1、次のレベルの番号は 4、最初のパラメータは 4、このレベルの前のレベルの番号は 0 であるため、2 番目のパラメータは 0、サブ輪郭が含まれているため、最初のパラメータは 0 です。サブコンター 数値 (もちろん 1 つだけが含まれます。複数の場合も同じ理由です) は 2 なので、3 番目のパラメーターは 2 です。これは最初のレベルにあるため、他のレベルに属さないため、4 番目のパラメーターは次のようになります。 -1...その後など

間違いがある場合は修正してください

おすすめ

転載: blog.csdn.net/m0_60447786/article/details/125452378