1. ホーム
  2. python

[解決済み】OpenCV Python cv2.perspectiveTransform。

2022-02-19 02:43:33

質問

現在、OpenCVとPythonを使って動画の手ぶれ補正を試みています。 回転を計算するために以下の関数を使用しています。

def accumulate_rotation(src, theta_x, theta_y, theta_z, timestamps, prev, current, f, gyro_delay=None, gyro_drift=None, shutter_duration=None):
    if prev == current:
        return src

    pts = []
    pts_transformed = []
    for x in range(10):
        current_row = []
        current_row_transformed = []
        pixel_x = x * (src.shape[1] / 10)
        for y in range(10):
            pixel_y = y * (src.shape[0] / 10)
            current_row.append([pixel_x, pixel_y])

            if shutter_duration:
                y_timestamp = current + shutter_duration * (pixel_y - src.shape[0] / 2)
            else:
                y_timestamp = current

            transform = getAccumulatedRotation(src.shape[1], src.shape[0], theta_x, theta_y, theta_z, timestamps, prev,
                                               current, f, gyro_delay, gyro_drift)

            output = cv2.perspectiveTransform(np.array([[pixel_x, pixel_y]], dtype="float32"), transform)
            current_row_transformed.append(output)

        pts.append(current_row)
        pts_transformed.append(current_row_transformed)

    o = utilities.meshwarp(src, pts_transformed)
    return o

になると、次のようなエラーが発生します。 output = cv2.perspectiveTransform(np.array([[pixel_x, pixel_y]], dtype="float32"), transform) :

cv2.error: /Users/travis/build/skvark/opencv-python/opencv/modules/core/src/matmul.cpp:2271: error: (-215) scn + 1 == m.cols in function perspectiveTransform

何かお手伝いやご提案があれば、本当に感謝します。

解決方法は?

この実装は、将来のバージョンで本当に変更する必要があります。

のOpenCVドキュメントから。 perspectiveTransform() :

src - 入力 ツーチャンネル (...) 浮動小数点型配列

斜めに強調したのは私です。

>>> A = np.array([[0, 0]], dtype=np.float32)
>>> A.shape
(1, 2)

ということは、ここから A は単なる1チャンネル行列、つまり2次元の行列です。1行、2列の行列です。代わりに 2チャンネル つまり、3次元の行列で、3次元の長さは2次元と3次元のどちらにポイントを送るかによって2か3になります。

長くなりましたが、送信する点の集合を三次元にするために、もう一つ括弧を追加する必要があります。 x の値は最初のチャンネルに、そして y の値は、2番目のチャンネルになります。

>>> A = np.array([[[0, 0]]], dtype=np.float32)
>>> A.shape
(1, 1, 2)

直感的ではありませんし、文書化されてはいるものの、その点についてはあまり明確ではありません。これだけでいいんです。を回答したことがあります。 以前、同じ質問をしたことがある の場合ですが cv2.transform() 関数を使用します。