You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV Python中透视变换结果异常问题求助

透视变换结果不符合预期的问题分析与解决

核心问题:坐标维度混淆+点顺序错误

你的代码存在两个关键错误,导致修改输出点后结果异常:

  1. 图像坐标维度搞反
    OpenCV中图像的shape返回顺序是(高度, 宽度, 通道数),也就是image.shape[0]是垂直方向像素数(y轴范围),image.shape[1]是水平方向像素数(x轴范围)。但你在定义input_points时,把image_dimensions[0](高度)当成了x坐标,image_dimensions[1](宽度)当成了y坐标,完全颠倒了x和y的对应关系。

  2. 点的顺序不匹配
    透视变换要求输入和输出的四个点必须保持完全一致的顺序(比如统一顺时针:左上角→右上角→右下角→左下角,或逆时针)。你原代码的输入点顺序是左上角→左下角→右下角→右上角,第一次输出点为矩形时碰巧得到预期结果,但修改单个点后,错误的坐标对应关系被放大,导致变换矩阵计算彻底出错。

修正后的代码

调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:45:21