透视变换的 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)
我使用以下方法找到了透视矩阵:
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)