我发现了一个透视矩阵,它使用:
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'"
我尝试在points_original
坐标中填充一个尾随1 (np.single([[0, 0, 1]])
),就像在文献资料中所做的那样,以及添加更多的点(np.single([[0, 0], [1, 1]])
或np.single([[0, 0, 1], [1, 1, 1]])
),删除列表中的嵌套层(np.single([0, 0])
、np.single([0, 0, 0])
)等等,但我不知道到底出了什么问题。蒂娅。
发布于 2022-02-04 10:44:36
根据@Danšek收到的有益评论,回答我自己的问题。
根据这些文件,src应该是:
输入双通道或三通道浮点阵列。
为了让OpenCV将numpy数组映射到cv::Mat ( OpenCV使用的C++类),通道(通常是RGB组件,但在本例中是坐标)需要是三维/轴(第一个维度是行,第二个列)。
要么通过在初始列表中添加另一个嵌套级别: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)
https://stackoverflow.com/questions/70938575
复制相似问题