Note by Yoshikawa

Love Technology and Art

openCVで台形補正

opencvを使って台形補正する方法を紹介

台形補正とは?

もともと四角形だったものを斜めから撮影すると遠近によるゆがみで台形に見える。
この遠近による歪みをなくし、真上から見た元の四角形の形に補正する。

やり方

①getPerspectiveTransformで透視変換行列を計算

getPerspectiveTransformでは元画像の変換したい台形の4つの頂点座標と変換後の画像サイズを入力して、変換行列を出力する。

変換行列の定義は以下
f:id:yoshikawat64m:20190121115333p:plain
引用:
opencv.jp


[変換前のx座標,変換前のy座標,1]
を追加したベクトルの変換行列を掛けると、
[変換後のx座標*t,変換後のy座標*t,t]になる

②warpPerspectiveで補正

warpPerspectiveは、元画像、変換行列、変換後の画像サイズを入力して、変換後の画像を出力する
①で求めた透視変換行列を使う

コード

# ---------------------------------------
#              透視変換行列取得
# ---------------------------------------
def get_transformMatrix(transformArea, transformSize):
    """
    Args:
        transformArea: 4点座標[top-left,top-right,down-right,down-left]
        transformSize: 変換後の画像サイズ(横,縦)
    Return:
        transformMatrix: 透視変換行列
    """
    pts1 = np.float32(transformArea)
    pts2 = np.float32([[0, 0], [transformSize[0], 0], [transformSize[0], transformSize[1]], [0, transformSize[1]]])
    transformMatrix = cv2.getPerspectiveTransform(pts1, pts2)
    return transformMatrix


# --------------------------------------------
#                   補正画像出力
# --------------------------------------------
def perspectiveTransform(img, transformMatrix, transformSize):
    """
    Args:
        img:元画像
        transformMatrix: 透視変換行列
        transformSize: 変換後の画像サイズ(横,縦)
    Return:
        transformImage: 変換後の画像
    """
    transformImage = cv2.warpPerspective(img, transformMatrix, transformSize)
    return transformImage