【问题标题】:OpenCV Python cv2.perspectiveTransformOpenCV Python cv2.perspectiveTransform
【发布时间】:2017-08-22 12:12:29
【问题描述】:

我目前正在尝试使用 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

任何帮助或建议将不胜感激。

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    这个实现确实需要在未来的版本中改变,或者文档应该更清楚。

    来自perspectiveTransform() 的 OpenCV 文档:

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

    我添加的倾斜强调。

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

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

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

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

    另外,正如 cmets 中所建议的:

    如果您有一个形状为 (n_points, dimension) 的数组点(即维度为 2 或 3),那么为这个用例重新格式化它的好方法是 points[np.newaxis]

    这不是直观的,虽然它已记录在案,但在这一点上并不是很明确。这就是你所需要的。我已经回答了 identical question before,但对于 cv2.transform() 函数。

    【讨论】:

    • 如果您有一个形状为(n_points, dimension) 的数组points(即dimension 是2 或3),那么为这个用例重新格式化它的好方法是points[np.newaxis]
    • @JackM 很棒的建议---编辑了我的帖子以包含它!
    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2016-11-28
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多