Python-OpenCVノート6--輪郭(Contours)

5523 ワード

Python-OpenCVノート6–アウトライン(Contours)


参照ドキュメント:https://docs.opencv.org/3.4/dd/d49/tutorial_py_contour_features.html

1、輪郭の検索findContours


関数プロトタイプ
image, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

パラメータ:
  • image:8ビット単一チャネル二値図、階調図非0値1
  • mode:プロファイルの検索モード
  • cv2.RETR_EXTERNAL:外郭
  • のみ検出することを示す
  • cv2.RETR_LIST:検出された輪郭は等級関係を確立しない
  • cv2.RETR_CCOMP:2つのレベルの輪郭を確立し、上の層は外境界であり、中の層は内孔の境界情報である.内孔内に連通物体がある場合、この物体の境界も最上階
  • にある.
  • cv2.RETR_TREE:階層ツリー構造の輪郭
  • を作成する
  • method:輪郭の近似方法
  • cv2.CHAIN_APPROX_NONE:すべての輪郭点が格納、隣接する2点の画素位置差が1を超えない、すなわちmax(x 1-x 2)、abs(y 2-y 1)==1
  • cv2.CHAIN_APPROX_SIMPLE:水平方向、垂直方向、対角線方向の要素を圧縮し、その方向の終点座標のみを保持し、例えば矩形の輪郭は4点で輪郭情報
  • を保存するだけである.
  • cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOSはteh-Chinl chain近似アルゴリズム
  • を用いる

    戻り値:
  • image:処理された画像、正常に
  • を使っていません
  • contours:numpyのndarray、各要素は画像の輪郭であり、各要素は複数の点
  • を含む.
  • hierarchy:numpyのndarrayは、要素の個数と輪郭の個数が同じであり、輪郭contours[i]はhierarchy[i]に対応し、各hierarchy要素は4つの要素hierarchy[i][0]~hierarchy[i][3]を含み、それぞれ後の輪郭、前の輪郭、親輪郭、内嵌輪郭のインデックス番号を表し、対応する項目がなければ、この値は負数である.
  • #  
    img = cv2.imread('1.jpg')  
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
    ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  
      _, contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    

    2、輪郭を描くfindContours


    関数プロトタイプ
    cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
    

    パラメータ:
  • イメージ:入力画像
  • contours:輪郭、1つの輪郭2点の次元数(1,1,2,1,2,2)
  • contourIdx:contoursのどの輪郭を描画しますか.-1の場合、その中のすべての輪郭
  • を描画します.
  • color:描画された輪郭の色
  • thickness:輪郭線の幅、-1(cv 2.FILLED)の場合、充填モード
  • #  
    cv2.drawContours(img,contours,-1,(0,0,255),3)  
    cv2.imshow("img", img)  
    cv2.waitKey(0) 
    

    3、輪郭の特徴Contour Features


    3.1、モーメント:cv 2.moments()


    関数のプロトタイプ:
    cv2.moments(array[, binaryImage])
    
  • array:単一の輪郭、1 xNx 1 x 2次元の配列、すなわちN個の2次元点
  • binaryImage:Trueの場合、0以外のピクセル値=1、デフォルトはFalse
  • 輪郭領域のモーメントを返す辞書
  • 例:
    import numpy as np
    import cv2
    
    img = cv2.imread('star.jpg',0)
    ret, thresh = cv2.threshold(img,127,255,0)
    im2,contours,hierarchy = cv2.findContours(thresh, 1, 2)
    cnt = contours[0]
    M = cv2.moments(cnt)
    
    #  x,y 
    cx = int(M['m10']/M['m00'])
    cy = int(M['m01']/M['m00'])
    

    3.2、面積:cv 2.contourArea()


    関数のプロトタイプ:
    cv2.contourArea(contour[, oriented])
    
  • contour:単一の輪郭、1 xNx 1 x 2次元の配列、すなわちN個の2次元点
  • oriented:Trueの場合、輪郭の方向フラグを取得できます.デフォルトはFalse
  • です.
  • は、輪郭領域の面積
  • を返す.
    例:
    area = cv2.contourArea(cnt)
    

    3.3、周長:cv 2.arcLength()


    関数のプロトタイプ:
    cv2.arcLength(curve, closed)
    
  • curve:単一の輪郭、1 xNx 1 x 2次元の配列、すなわちN個の2次元点
  • closed:カーブが閉じているかどうかを示すフラグ
  • は、輪郭領域の周長
  • を返す.
    例:
    perimeter = cv2.arcLength(cnt, True)
    

    3.4、凸性検査:cv 2.isContourConvex()


    関数のプロトタイプ:
    cv2.isContourConvex(contour)
    
  • contour:単一の輪郭、1 xNx 1 x 2次元の配列、すなわちN個の2次元点
  • は、輪郭が凸であるかどうか、Trueであるかどうか、False
  • であるかどうかを返します.
    例:
    k = cv2.isContourConvex(cnt)
    

    4、輪郭近似Contour Approximation


    4.1、多角形近似:cv 2.approxPolyDP()


    関数のプロトタイプ:
    cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])
    
  • curve:単一の輪郭、1 xNx 1 x 2次元の配列、すなわちN個の2次元点
  • epsilon:点の最大距離
  • closed:カーブが閉じているかどうかを設定します.すなわち、最初と最後の2点が同じ点であるかどうか
  • が得られます.
  • は、近似輪郭の2 D点セット
  • を返す.
    例:
    epsilon = 0.1*cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, epsilon, True)
    

    4.2、凸包近似:cv 2.convexHull()


    関数のプロトタイプ:
    cv2.convexHull(points[, hull[, clockwise[, returnPoints]]])
    
  • points:単一の輪郭、1 xNx 1 x 2次元の配列、すなわちN個の2次元点
  • hull:出力配列、通常は
  • を使用しない
  • clockwise:Trueの場合、出力されるバンプは時計回りで、そうでない場合はデフォルトの反時計回りです.
  • returnPoints:デフォルト値はTrueで、凸包上の点の座標を返し、Falseの場合、凸包点に対応する輪郭上の点を返します.
  • は、近似輪郭の2 D点セット
  • を返す.
    例:
    hull = cv2.convexHull(cnt)
    

    4.3、矩形近似:Bounding Rectangle


    関数のプロトタイプ:
    #  
    cv2.boundingRect(points)  # 1
    
    #  , 
    cv2.minAreaRect(points)  # 2
    
    #  
    cv2.boxPoints(box)  # 3
    
  • points:単一の輪郭、1 xNx 1 x 2次元の配列、すなわちN個の2次元点
  • box:4つの2次元点の配列
  • :
  • 1:略矩形の左上角点座標、矩形の幅と高さ(x,y,w,h)
  • 2:近似矩形の最上角点座標(x,y)、矩形の幅と高さ(w,h)、および回転角度θ(°)
  • 3:長方形に変換する4つの角点座標

  • 例:
    #  
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
    
    #  , 
    rect = cv2.minAreaRect(cnt)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(img,[box],0,(0,0,255),2)
    

    4.4、その他の近似

    #  
    (x,y),radius = cv2.minEnclosingCircle(cnt)
    center = (int(x),int(y))
    radius = int(radius)
    cv2.circle(img,center,radius,(0,255,0),2)
    
    #  
    ellipse = cv2.fitEllipse(cnt)
    cv2.ellipse(img,ellipse,(0,255,0),2)
    
    #  
    rows,cols = img.shape[:2]
    [vx,vy,x,y] = cv2.fitLine(cnt, cv.DIST_L2,0,0.01,0.01)
    lefty = int((-x*vy/vx) + y)
    righty = int(((cols-x)*vy/vx)+y)
    cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)