透视变换的 OpenCV 问题 - scn + 1 和 m.cols

OpenCV problem with perspectiveTransform - scn + 1 and m.cols

我使用以下方法找到了透视矩阵:

import numpy as np
import cv2 as cv

points_src = np.single([[0, 0], [0, 1], [1, 1], [1, 0]])
points_dst = np.single([[0.5, 0.5], [0.5, 2], [2, 2], [2, 0.5]])
perspective_matrix = cv.getPerspectiveTransform(points_src, points_dst)

产生预期的结果:

>>> perspective_matrix
array([[1.5, 0. , 0.5],
       [0. , 1.5, 0.5],
       [0. , 0. , 1. ]])

但是,当我尝试使用 perspectiveTransform 变换点时:

points_original = np.single([[0, 0]])
points_transformed = cv.perspectiveTransform(points_original, perspective_matrix)

我收到以下错误:

"error: (-215:Assertion failed) scn + 1 == m.cols in function 'cv::perspectiveTransform'"

我尝试用尾随 1 (np.single([[0, 0, 1]])) 填充 points_original 坐标,就像在 the documentation 中完成的那样,以及添加更多点 (np.single([[0, 0], [1, 1]])np.single([[0, 0, 1], [1, 1, 1]])), 删除列表中的一层嵌套 (np.single([0, 0]), np.single([0, 0, 0])), 等等, 等等, 我不知道还有什么问题。 TIA.

根据@Dan Mašek 提供的有用评论回答我自己的问题。

根据文档,src 应该是:

input two-channel or three-channel floating-point array.

为了让 OpenCV 将 numpy 数组映射到 cv::Mat(OpenCV 使用的 C++ class),通道(通常是 RGB 分量,但在这种情况下是坐标)需要是第 3 dimension/axis(第一个维度是行,第二个是列)。

通过向初始列表添加另一层嵌套来创建形状正确的数组:np.single([[[0, 0]]]),或者重塑现有数组:np.single([[0, 0]]).reshape(-1,1,2)。这会根据需要生成尽可能多的行(在本例中为一行),每行一列,每列两个通道。

TLDR:

我只是需要一个额外的嵌套层,例如:

points_original = np.single([[[0, 0]]])
points_transformed = cv.perspectiveTransform(points_original, perspective_matrix)