5

台形 (最初の画像) から長方形 (2 番目の画像) に変換しようとしていますが、奇妙な結果が得られます (3 番目の画像)。

ここに画像の説明を入力

私の計画は、台形の 4 つの角点と長方形の 4 つの角点によって定義される透視変換を使用することでした。

この例では、台形の場合は次のようになります。

ptsTrap = [[  50.          100.        ]
           [  50.          200.        ]
           [ 250.           64.73460388]
           [ 250.          235.26539612]]

長方形の場合:

ptsRect = [[  50.  100.]
           [  50.  200.]
           [ 250.  100.]
           [ 250.  200.]]

私はこれらの点から遠近変換を得ています:

T = cv2.getPerspectiveTransform(ptsTrap, ptsRect)

そして、それからイメージを構築します:

arrTrapToRect = cv2.warpPerspective(arrTrap, T, arrTrap.shape[:2])

ただし、画像からわかるように、これは期待される変換を行っていません。

変換を定義したポイントでさえ、それに従って投影されていない理由がわかりません。何か案は?

4

1 に答える 1

8

あなたの方法論は正しいです。コーナーポイントの座標を指定するときに問題が発生します。どのように計算したかはわかりませんが、X 軸と Y 軸が入れ替わっています。これは、最終的な画像に適用される変換に反映されます。コーナーポイントは次のとおりです。

ptsTrap = [[[  99.   51.]]
           [[  64.  251.]]
           [[ 234.  251.]]
           [[ 199.   51.]]]

ptsRect = [[[ 102.   49.]]
           [[ 100.  249.]]
           [[ 200.  250.]]
           [[ 200.   50.]]]

これらのポイントから透視変換を見つけると、正しい結果が得られます。 透視変換結果

参考までに、これは私が使用したコードです:

import cv2
import numpy as np

def find_corners(image):
    im = cv2.Canny(image, 100, 200)

    cnt = cv2.findContours(im,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
    cnt = cv2.approxPolyDP(cnt[0], 5, True)
    return cnt.astype(np.float32)

def main(argv):
    trap = cv2.imread('trap.png', cv2.IMREAD_GRAYSCALE)
    rect = cv2.imread('rect.png', cv2.IMREAD_GRAYSCALE)

    ptsTrap = find_corners(trap)
    ptsRect = find_corners(rect)

    T = cv2.getPerspectiveTransform(ptsTrap, ptsRect)

    warp = cv2.warpPerspective(trap, T, rect.shape[:2])

    cv2.imshow('', warp)
    cv2.imwrite('warp.png', warp)
    cv2.waitKey()
    cv2.destroyAllWindows()
于 2013-07-17T17:04:44.573 に答える