在 OpenCV 中,坐标还原通常指将经过变换(如旋转、缩放、仿射/透视变换)后的图像中的坐标点,反向映射回原始图像中的对应位置。这在目标检测、图像配准、几何校正等场景中非常关键。
一、坐标还原的核心原理
坐标还原本质是 逆变换。若对图像应用了某种变换矩阵 ( M ),则还原坐标需使用其逆矩阵 ( M^{-1} )。
数学表示:
- 变换公式:( \text{dst}(x’, y’) = M \cdot \text{src}(x, y) )
- 逆变换公式:( \text{src}(x, y) = M^{-1} \cdot \text{dst}(x’, y’) )
二、常见场景与实现方法
1. 仿射变换的坐标还原
仿射变换(如旋转、平移、缩放)使用 2x3 矩阵,可通过计算逆矩阵还原坐标。
步骤:
- 生成逆变换矩阵:
OpenCV 提供cv2.invertAffineTransform(M)
直接计算仿射矩阵的逆矩阵。 - 应用逆变换:
使用cv2.transform()
或手动矩阵乘法还原坐标。
代码示例:
import cv2
import numpy as np
# 原图尺寸
h, w = 400, 600
# 定义仿射变换矩阵(旋转45度)
center = (w//2, h//2)
M = cv2.getRotationMatrix2D(center, angle=45, scale=1.0)
# 变换后的图像
rotated = cv2.warpAffine(img, M, (w, h))
# 计算逆矩阵
M_inv = cv2.invertAffineTransform(M)
# 假设变换后图像中的点 (x_dst, y_dst)
x_dst, y_dst = 100, 200
# 还原到原图坐标
src_point = np.array([[x_dst, y_dst]], dtype=np.float32)
restored_point = cv2.transform(src_point.reshape(1,