使用cv2.getPerspectiveTransform()触发(-215:Assertion failed)错误求助
解决cv2.getPerspectiveTransform()的(-215:Assertion failed)错误
错误原因
cv2.getPerspectiveTransform()用于计算透视变换的单应矩阵,这个函数强制要求输入的源点和目标点必须各为4组不共线的对应点(透视变换矩阵是3x3结构,有8个自由度,需要4个点才能唯一求解)。你传入了9组点,不符合函数的输入要求,因此触发断言失败错误。
解决方案
1. 计算透视变换矩阵(仅需4组对应点)
从你的源点和目标点中选择4个不共线的对应角点,比如四个顶点:
import numpy as np import cv2 # 选择4组对应角点 srcpoints = np.array([[0,0], [200,0], [200,200], [0,200]], np.float32) targetpoints = np.array([[60,60], [1860,60], [1860,1020], [60,1020]], np.float32) # 计算透视变换矩阵 matrix = cv2.getPerspectiveTransform(srcpoints, targetpoints)
2. 转换所有9个点(先算矩阵,再批量转换)
如果需要将所有9个源点都转换到目标坐标系,先用4个点算出矩阵,再用cv2.perspectiveTransform()批量处理:
import numpy as np import cv2 # 原始所有源点 all_src = np.array([[0,0],[100,0],[200,0],[0,100],[100,100],[200,100],[0,200],[100,200],[200,200]], np.float32) # 选4组对应角点用于计算矩阵 src_matrix_points = np.array([[0,0], [200,0], [200,200], [0,200]], np.float32) target_matrix_points = np.array([[60,60], [1860,60], [1860,1020], [60,1020]], np.float32) # 计算透视变换矩阵 matrix = cv2.getPerspectiveTransform(src_matrix_points, target_matrix_points) # 批量转换所有点,注意要增加一个维度(函数要求输入为(N,1,2)的形状) all_transformed_points = cv2.perspectiveTransform(all_src[np.newaxis, :, :], matrix)[0] print(all_transformed_points)
注意事项
- 用于计算矩阵的4个点不能共线,否则无法求出有效透视矩阵。
- 实际场景中的小数坐标不影响,只要保证是
np.float32类型即可。
内容的提问来源于stack exchange,提问作者Ishan Jain
相关产品推荐
相关产品推荐

