OpenCV Python中透视变换结果异常问题求助
透视变换结果不符合预期的问题分析与解决
核心问题:坐标维度混淆+点顺序错误
你的代码存在两个关键错误,导致修改输出点后结果异常:
图像坐标维度搞反
OpenCV中图像的shape返回顺序是(高度, 宽度, 通道数),也就是image.shape[0]是垂直方向像素数(y轴范围),image.shape[1]是水平方向像素数(x轴范围)。但你在定义input_points时,把image_dimensions[0](高度)当成了x坐标,image_dimensions[1](宽度)当成了y坐标,完全颠倒了x和y的对应关系。点的顺序不匹配
透视变换要求输入和输出的四个点必须保持完全一致的顺序(比如统一顺时针:左上角→右上角→右下角→左下角,或逆时针)。你原代码的输入点顺序是左上角→左下角→右下角→右上角,第一次输出点为矩形时碰巧得到预期结果,但修改单个点后,错误的坐标对应关系被放大,导致变换矩阵计算彻底出错。
修正后的代码
调整input_points的坐标顺序和维度对应关系,统一使用顺时针点顺序:
import cv2 as cv import numpy as np image = cv.imread('Imagery/TEST2.png') h, w = image.shape[:2] # 直接拆分高度和宽度,避免维度混淆 # 顺时针顺序:左上角、右上角、右下角、左下角 input_points = np.float32([ [0, 0], # 左上角 (x, y) [w-1, 0], # 右上角 [w-1, h-1], # 右下角 [0, h-1] # 左下角 ]) # 修改后的输出点,左上角向内偏移 output_points = np.float32([[70, 70], [50,150], [150,150], [150,50] ]) * 3 perspective_matrix = cv.getPerspectiveTransform(input_points, output_points) # warpPerspective的输出尺寸格式为(宽度, 高度),与shape顺序相反 transformed_image = cv.warpPerspective(image, perspective_matrix, (1920, 1080)) cv.imshow('perspective adjusted image', transformed_image) cv.waitKey(0) cv.destroyAllWindows()
额外注意事项
- 输入和输出的四个点必须严格遵循同一顺序(顺时针/逆时针),不能打乱,否则变换会出现扭曲或翻转。
- 输出的四个点不能构成自相交的四边形,否则透视变换无法生成合理的鸟瞰效果。
cv2.warpPerspective的第三个参数是输出图像尺寸,格式为(宽度, 高度),和图像shape的(高度, 宽度)顺序相反,你的原代码此处是正确的。
内容的提问来源于stack exchange,提问作者Philip Nicoll
相关产品推荐
相关产品推荐

