今回は、OpenCVの輪郭について説明します。輪郭はOpenCVの非常に重要な部分です。同時に、前に説明したキャニーエッジ検出が基礎となります。
輪郭検出
関数プロトタイプ:
cv2.findContours(画像、モード、メソッド、等高線=なし、階層=なし、オフセット=なし)
パラメータの意味:
画像は入力画像を表します。入力画像はバイナリ画像でなければならないことに注意してください。入力画像がカラー画像の場合、最初にグレースケールで2値化する必要があります。
modeは、輪郭の取得モードを表します。4つのタイプがあります。
cv2.RETR_EXTERNALは、外側の輪郭のみが検出されることを意味します。
cv2.RETR_LISTによって検出された輪郭は、階層関係を確立しません。
cv2.RETR_CCOMPは、2つのレベルの輪郭を確立します。上位層は外側の境界であり、内側層は内側の穴の境界情報です。内側の穴に接続されたオブジェクトがある場合、このオブジェクトの境界も最上層にあります。
cv2.RETR_TREEは、階層ツリー構造のアウトラインを構築します。
方法は輪郭の近似方法です。4種類あります。
cv2.CHAIN_APPROX_NONEはすべての輪郭点を格納し、2つの隣接する点間のピクセル位置の差は1を超えません。つまり、max(abs(x1-x2)、abs(y2-y1))<= 1です。
cv2.CHAIN_APPROX_SIMPLEは、要素を水平方向、垂直方向、斜め方向に圧縮し、その方向の終点座標のみを保持します。たとえば、長方形の輪郭は、輪郭情報を保存するために4つの点しか必要としません。
cv2.CHAIN_APPROX_TC89_L1およびcv2.CHAIN_APPROX_TC89_KCOSは、the-Chinlチェーン近似アルゴリズムを使用します。
戻り値:
cv2.findContours()関数は2つの値を返します。1つは輪郭自体の輪郭で、もう1つは各輪郭に対応する属性階層です。
最も単純な等高点情報のみが必要なため、通常、パラメーターcv2.CHAIN_APPROX_SIMPLEを選択します。
輪郭描画
次に、別の関数を見てみましょう。
cv2.drawContours(image、contours、contourIdx、color、thickness = None、lineType = None、hierarchy = None、maxLevel = None、offset = None)
最初のパラメータは、等高線を描画する画像を指定することです。画像は3つのチャネルでのみ等高線を表示できます
2番目のパラメーターはPythonのリストである輪郭自体です。
3番目のパラメーターは、等高線リストのどの等高線を描画するかを指定します。-1の場合は、すべての等高線を描画します。次のパラメータは非常に単純です。太さは等高線の幅を示し、-1(cv2.FILLED)の場合は塗りつぶしモードです。
次に、この写真を例として取り上げます。
次に、実際のコード戦闘に進みます。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("contours.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
contour = cv2.findContours(gray,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(img,contour,-1,(0,0,255),2)
cv2.imshow("res",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
パラメータを変更することもできます:
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("contours.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
contour = cv2.findContours(gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(img,contour,-1,(0,0,255),2)
cv2.imshow("res",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
すべての輪郭を検出するには、RETR_EXTERNALをRETR_TREEに変更します(以前は外部の輪郭を検出していました)。
これで輪郭を選択することもできます。コードのdrawContoursのパラメーターを変更する必要があります。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("contours.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
contour = cv2.findContours(gray,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(img,contour,1,(0,0,255),2)
cv2.imshow("res",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3番目のパラメーターを変更することで、選択する輪郭をカスタマイズできます。これは、後で他の操作に非常に便利です。
同様に、いくつかの等高線も計算できます。Numpyを適用します。コードを見てみましょう。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("contours.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
contour = cv2.findContours(gray,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
print(np.array(contour).shape)
cv2.drawContours(img,contour,1,(0,0,255),2)
cv2.imshow("res",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
次の出力列は、等高線の数を出力し、パラメーターを変更して再試行します。
view plaincopy to clipboardprint?
import cv2
import numpy as np
img = cv2.imread("contours.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
contour = cv2.findContours(gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[0]
print(np.array(contour).shape)
cv2.drawContours(img,contour,1,(0,0,255),2)
cv2.imshow("res",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
このチュートリアルでは、コンターの基本的な紹介を行いました。次回は、コンターに関する他のコンテンツを紹介します。
記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜