已知原图单点坐标,如何获取cv2.remap变换后的对应像素坐标?
如何计算原始图像点在remap变换后的对应坐标
嘿,这个问题我太熟悉了!首先得明确一个关键细节:cv2.remap 使用的是反向映射——也就是说,变换后图像里的每个像素坐标 (x,y),对应的是原始图像中的坐标 (map1[y][x], map2[y][x])。所以你要的「原始点→变换后点」的正向映射,没法直接从现有的 Left_Stereo_Map 里查,得用生成映射时的参数重新计算。
下面是具体的实现步骤和代码:
核心思路
我们需要把原始图像的像素点,依次经过去畸变和**校正(rectify)**两个步骤,得到它在变换后图像中的坐标:
- 用
cv2.undistortPoints把原始图像的像素点转换为去畸变后的相机坐标系点 - 用校正矩阵
RL和投影矩阵PL,把相机坐标系点转换为校正后的图像坐标系点
完整代码实现
把你的代码补全后是这样的:
import cv2 import numpy as np # 假设MLS, dLS, RL, PL, imgShape, PORT, PREDEFINED_X, PREDEFINED_Y都已提前定义 Left_Stereo_Map = cv2.initUndistortRectifyMap(MLS, dLS, RL, PL, imgShape, cv2.CV_16SC2) leftCap = cv2.VideoCapture(PORT) while (True): ret1, leftFrame = leftCap.read() if not ret1: break # 处理读取失败的情况 Left_nice = cv2.remap(leftFrame, Left_Stereo_Map[0], Left_Stereo_Map[1], cv2.INTER_LANCZOS4, cv2.BORDER_CONSTANT, 0) # 原始点坐标 original_x = PREDEFINED_X original_y = PREDEFINED_Y # 步骤1:把原始点转换为齐次坐标,格式是[[[x, y]]] src_point = np.array([[[original_x, original_y]]], dtype=np.float32) # 步骤2:去畸变+校正,直接得到变换后的图像坐标系点 undistorted_point = cv2.undistortPoints(src_point, MLS, dLS, R=RL, P=PL) # 步骤3:转换为整数像素坐标(像素是离散的整数点) x_after = int(round(undistorted_point[0][0][0])) y_after = int(round(undistorted_point[0][0][1])) # 可选:在变换后的图像上标记这个点,验证结果 cv2.circle(Left_nice, (x_after, y_after), 5, (0, 0, 255), -1) cv2.imshow('Rectified Left', Left_nice) if cv2.waitKey(1) & 0xFF == ord('q'): break leftCap.release() cv2.destroyAllWindows()
关键细节解释
cv2.undistortPoints的参数里,R=RL和P=PL会直接把去畸变后的点转换到校正后的图像坐标系,一步到位,不需要额外手动计算矩阵乘法。- 最后用
round取整是因为像素坐标必须是整数,比直接截断更贴近真实映射位置。 - 如果要处理多个点,只需要把
src_point改成包含多个点的数组,比如[[[x1,y1]], [[x2,y2]], ...],函数会自动批量处理。
内容的提问来源于stack exchange,提问作者Son Nguyen




