5

私のアプリケーションでは、ある四辺形を別の四辺形にマッピングする必要があります。これらはどちらも長方形ではありません。

ただし、warpPerspective()から得られる結果は、常に長方形です。「外れ値」フラグを別の値に設定して、ワープしたクワッドの外側のピクセルが宛先画像に表示されないようにしましたが、何も機能しないようです。私が欲しいのは、ワープされたクワッドの外側のピクセルが透明に設定されたワープされたクワッドです。

どうすればこれを達成できますか?

または、OpenCVで四角形の外側の領域をマスクして、四角形だけを別の画像にコピーできるようにする簡単な方法はありますか?

関連する場合は、OpenCVへのPythonバインディングを使用しています。

これが私の現在のコードです:

def warpImage(image, corners, target, width, height):
    mat = cv2.getPerspectiveTransform(corners, target)
    out = numpy.zeros(shape=(width, height), dtype="uint8")
    out = cv2.warpPerspective(image, mat, (width,height), out, cv2.INTER_CUBIC)
    return out

コーナーとターゲットは両方とも非長方形の四角形です。ただし、出力は全幅x高さの長方形です。どのピクセルも黒または透明ではありません。代わりに、それらはコーナークワッドの内側と外側の両方の画像からのピクセルです。中にあるものだけが欲しいです。

4

1 に答える 1

0

私が見つけた最良のオプションは、ピクセルを循環し、歪んだクワッドのピクセルを matplotlib pnpoly() 関数を使用してリマップ配列にコピーすることです。

import matplotlib.nxutils as nx 

def warpImage(image, corners, target, width, height, x0, y0, remap):
    mat = cv2.getPerspectiveTransform(corners, target)
    out = cv2.warpPerspective(image, mat, (width,height), flags=cv2.INTER_CUBIC)
    for x in range(0,width):
        for y in range(0,height):
            if nx.pnpoly(x,y,target) == 1:
                for i in range(0,3):
                    remap[y+y0,x+x0,i] = out[y,x,i]

    return remap

画像内のすべての四角形をループし、変換されたバージョンをリマップに蓄積します。

各ピクセルにアクセスする必要があるのはあまり効率的ではありませんが、幸いなことに、これは 1 回限りの変換です。

于 2012-10-12T15:05:44.403 に答える