[Ch 05]ジオメトリ変換-漁師変換とパース変換


漁師変換vs透視変換



パース変換により、より多くの角度に変換できます.

漁師変換は自動的に最後の点を決定し、透視変換は手動で最後の点を決定しなければならない.

Apin変換マトリックスを求めます

cv2.getAffineTransform(src, dst) -> retval
  • src:3つの原点座標点.numpy.ndarray.shape=(3, 2)
  • ex) np.array([[x1, y1], [x2, y2], [x3, y3]], np.float32)
  • dst:3結果座標点.numpy.ndarray.shape=(3, 2)
  • retval:2 x 3ピボット変換行列
  • ピボット変換マトリクスを求める

    cv2.getPerspectiveTransform(src, dst, solveMethod=None) -> retval
  • src:4原点座標点.numpy.ndarray.shape=(4, 2)
  • ex) np.array([[x1, y1], [x2, y2], [x3, y3], [x4, y4]], np.float32)
  • dst:4つの結果座標点.numpy.ndarray.shape=(4, 2)
  • retval:3 x 3ピボット変換マトリクス
  • 画像の漁師変換関数

    cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
  • src:入力ビデオ
  • M:2 x 3漁師変換行列.実刑.
  • dsize:結果画像サイズ.(w,h)調音.(0,0)srcと同じサイズに設定します.
  • dst:結果映像
  • flags:補間法.デフォルトはcv 2です.INTER_LINEAR.
  • borderMode:エッジピクセル拡張.デフォルトはcv 2です.BORDER_CONSTANT.
  • borderValue : cv2.NORDER CONSTANTで使用される定数値.既定値は0です.
  • 画像のピボット変換関数

    cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
  • src:入力ビデオ
  • M:3ピボット変換行列.実刑.
  • dsize:結果画像サイズ.(w,h)調音.(0,0)srcと同じサイズに設定します.
  • dst:出力ビデオ
  • flags:補間法.デフォルトはcv 2です.INTER_LINEAR.
  • borderMode:エッジピクセル拡張.デフォルトはcv 2です.BORDER_CONSTANT.
  • borderValue : cv2.BORDER CONSTANTで使用する定数値.既定値は0です.
  • ピボット変換の例(歪んだ名刺を展開)

    src = cv2.imread('namecard.jpg')
    
    w, h = 720, 400
    srcQuad = np.array([[325, 307], [760, 369], [718, 611], [231, 515]], np.float32)
    dstQuad = np.array([[0, 0], [w-1, 0], [w-1, h-1], [0, h-1]], np.float32)
    pers = cv2.getPerspectiveTransform(srcQuad, dstQuad)
    dst = cv2.warpPerspective(src, pers, (w, h))

    適用例:マウスの配置

    src = cv2.imread('namecard.jpg')
    
    clicked_points = []
    def on_mouse(event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            clicked_points.append([x, y])
    
    w, h = 720, 400
    srcQuad = np.array([clicked_points[0], clicked_points[1], clicked_points[2], clicked_points[3]], np.float32)
    dstQuad = np.array([[0, 0], [w-1, 0], [w-1, h-1], [0, h-1]], np.float32)
    
    pers = cv2.getPerspectiveTransform(srcQuad, dstQuad)
    dst = cv2.warpPerspective(src, pers, (w, h))
  • マウスの左ボタンで下の赤い点の位置をクリックします.
  • その結果、赤点が連なる四角形で出力される.