OpenCV Python cv2.perspectiveTransform

10

我目前正在尝试使用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。如果有任何帮助或建议,将不胜感激。
1个回答

22

未来版本中需要更改此实现方式,或应该使文档更加清晰明了。

引自OpenCV文档中的perspectiveTransform():

src – 输入的 二通道 (...) 浮点数数组

强调部分由我添加。

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

从这里我们可以看到,A只是一个单通道矩阵,也就是二维的。一行两列。相反,您需要一个双通道图像,即一个三维矩阵,其中第三个维度的长度为2或3,具体取决于您发送的是二维点还是三维点。

长话短说,您需要添加一个括号集,使您发送的点成为三维点,其中x值在第一个通道中,y值在第二个通道中。

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

还有,根据评论的建议:

如果你有一个形状为(n_points,dimension)的数组points(即dimension为2或3),一种很好的重新格式化它以用于这种情况的方法是points[np.newaxis]

这不是很直观,虽然有文档记录,但在这一点上并不是非常明确。这就是你需要的全部内容。我之前回答过一个相同的问题,但是针对的是cv2.transform()函数。


1
如果你有一个形状为(n_points, dimension)(即dimension为2或3)的数组points,一个很好的重新格式化它以适用于此用例的方法是points[np.newaxis] - Jack M
@JackM 好建议——我已经编辑了我的帖子以包含它! - alkasm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接