[Ch 08]ビデオ分割とオブジェクト検出-モーメントベースのオブジェクト検出


モーメンツとは?

  • 映像形態を表す一連の実数値
  • 特定の関数セットに関する形で計算
  • ex) Geometric moments :
  • Geometric moments, Central moments, Normalized central moments, Legendre moments, Complex moments, Zernike moments, ART(Angular Radial Transform), etc
  • Huの7つの不変モーメント(Hu's 7不変モーメント)

  • 3回以下の正規化中心モーメントを組み合わせた7つのモーメント値
  • 画像のサイズ、回転、移動、並進は変わらない
  • けいじょうひかくかんすう

    cv2.matchShapes(contour1, contour2, method, parameter) -> retval
  • 等高線1:1番目の輪郭または階調画像
  • 等高線2:2番目の輪郭または階調画像
  • method:比較方法を指定します.
    使用cv2.CONTOURs_MATCH_l1cv2.CONTOURs_MATCH_l2cv2.CONTOURs_MATCH_l3の一つ
  • cv2.CONTOURs_MATCH_l3がベストな方法です.
  • パラメータ:未使用.0を指定します.
  • retval:2つの輪郭または階調画像間の距離
  • 注意事項
  • HUの不変モーメント2つの輪郭または画像の形状を比較するため→大きさ、回転、移動、対称変換に靭性を有する
  • モーメントベースのオブジェクト検出例

    obj = cv2.imread('spades.png', cv2.IMREAD_GRAYSCALE)
    src = cv2.imread('symbols.png', cv2.IMREAD_GRAYSCALE)
    
    # 객체 영상 외곽선 검출
    _, obj_bin = cv2.threshold(obj, 128, 255, cv2.THRESH_BINARY_INV)
    obj_contours, _ = cv2.findContours(obj_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    obj_pts = obj_contours[0]
    
    # 입력 영상 분석
    _, src_bin = cv2.threshold(src, 128, 255, cv2.THRESH_BINARY_INV)
    contours, _ = cv2.findContours(src_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    
    # 결과 영상
    dst = cv2.cvtColor(src, cv2.COLOR_GRAY2BGR)
    
    # 입력 영상의 모든 객체 영역에 대해서
    for pts in contours:
        if cv2.contourArea(pts) < 1000:
            continue
    
        rc = cv2.boundingRect(pts)
        cv2.rectangle(dst, rc, (255, 0, 0), 1)
    
        # 모양 비교
        dist = cv2.matchShapes(obj_pts, pts, cv2.CONTOURS_MATCH_I3, 0) # dist 값으로 유사도 측정
    
        cv2.putText(dst, str(round(dist, 4)), (rc[0], rc[1] - 3),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 0, 0), 1, cv2.LINE_AA)
    
        if dist < 0.1: # dist 값이 작을수록 obj와 유사하다.
            cv2.rectangle(dst, rc, (0, 0, 255), 2)

    dist値の低いオブジェクトが検出されました.