You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

已知原图单点坐标,如何获取cv2.remap变换后的对应像素坐标?

如何计算原始图像点在remap变换后的对应坐标

嘿,这个问题我太熟悉了!首先得明确一个关键细节:cv2.remap 使用的是反向映射——也就是说,变换后图像里的每个像素坐标 (x,y),对应的是原始图像中的坐标 (map1[y][x], map2[y][x])。所以你要的「原始点→变换后点」的正向映射,没法直接从现有的 Left_Stereo_Map 里查,得用生成映射时的参数重新计算。

下面是具体的实现步骤和代码:

核心思路

我们需要把原始图像的像素点,依次经过去畸变和**校正(rectify)**两个步骤,得到它在变换后图像中的坐标:

  1. cv2.undistortPoints 把原始图像的像素点转换为去畸变后的相机坐标系点
  2. 用校正矩阵 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=RLP=PL 会直接把去畸变后的点转换到校正后的图像坐标系,一步到位,不需要额外手动计算矩阵乘法。
  • 最后用round取整是因为像素坐标必须是整数,比直接截断更贴近真实映射位置。
  • 如果要处理多个点,只需要把 src_point 改成包含多个点的数组,比如 [[[x1,y1]], [[x2,y2]], ...],函数会自动批量处理。

内容的提问来源于stack exchange,提问作者Son Nguyen

火山引擎 最新活动