[OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点


学习remap的时候发现map1和map2的参数跟我的直观理解略有差别,在次记录一下。

一、背景

把一幅图像内的像素点放置到另外一幅图像内的指定位置,这个过程称为重映射。OpenCV 提供了多种重映射方式,但是我们有时会希望使用自定义的方式来完成重映射。OpenCV 内的重映射函数 cv2.remap()提供了更方便、更自由的映射方式,其语法格式如下:dst=cv2.remap(src,map1,map2,interpolation[,borderMode[,borderValue]])式中:
● dst 代表目标图像,它和 src 具有相同的大小和类型。
● src 代表原始图像。
● map1 参数有两种可能的值:
1 表示(x,y)点的一个映射。
2 表示 CV_16SC2 ,CV_32FC1的 x 值。
● map2 参数有两种可能的值:
1 空。
2 表示 CV_16SC2 ,CV_32FC1的y 值。
● Interpolation 代表插值方式,这里不支持 INTER_AREA 方法。具体值参见表 5-1。
● borderMode 代表边界模式。当该值为 BORDER_TRANSPARENT 时,表示目标图像内的对应源图像内奇异点(outliers)的像素不会被修改。
● borderValue 代表边界值,该值默认为 0。

5.5.1映射参数的理解
重映射通过修改像素点的位置得到一幅新图像。在构建新图像时,需要确定新图像中每.
个像素点在原始图像中的位置。因此,映射函数的作用是查找新图像像素在原始图像内的位
置。该过程是将新图像像素映射到原始图像的过程,因此被称为反向映射。在函数
cv2.remap()中,参数map1和参数map2用来说明反向映射,map1针对的是坐标x,
map2针对的是坐标y。
需要说明的是,map1和map2的值都是浮点数。因此,目标图像可以映射回一个非整
数的值,这意味着目标图像可以「反向映射」到原始图像中两个像素点之间的位置(当 然,
该位置是不存在像素值的)。这时,可以采用不同的方法实现插值,函数中的interpolation 参
数可以控制插值方式。正是由于参数map1和参数map2的值是浮点数,所以通过函数
cv2.remamp () 所能实现的映射关系变得更加随意,可以通过自定义映射参数实现不同形式
的映射。

以上内容摘自《OpenCV轻松入门》

阅读完这一段,我从直觉上认为mapx应该控制x,mapy应该控制y。

试了一下

import numpy as np
import cv2 as cv

img = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
rows, cols = img.shape[0:2
<think>好的,我现在需要回答用户关于双目摄像头经过cv.remap处理后左右图像是否相同的问题。首先,我得回顾一下OpenCVcv2.remap()的作用。根据用户提供的引用[1]和[2],这个函数允许自定义像素的映射方式,将原图中的像素重定位到新位置。 接下来,我需要理解双目摄像头的工作原理。通常,双目摄像头有两个镜头,左右摄像头拍摄的图像存在视差,这种视差用于计算深度信息。在标定过程中,会校正左右摄像头的图像,使得它们在同一水平线上,也就是所谓的极线校正。这一步通常通过立体校正算法完成,比如Bouguet算法,生成映射表,然后用cv2.remap()应用这些映射。 用户的问题是处理后的左右图像是否相同。根据立体校正的目的,校正后的左右图像应该在行方向上对齐,但列方向上保留视差。因此,左右图像的内容并不完全相同,只是几何形状被调整以便于后续的立体匹配。例如,同一物体在左右图像中的行坐标相同,但列坐标不同,从而产生视差。 需要确认的是,cv2.remap()根据不同的映射参数(map1map2)来处理左右图像。左右摄像头各自的畸变参数和校正矩阵不同,因此生成的映射表也不同。应用不同的映射表后,左右图像虽然经过几何变换,但内容不会完全相同,仍然保留必要的视差信息。 最后,总结关键:左右图像经过不同的映射处理,几何形状被校正到同一平面,行对齐,但内容存在视差,因此不相同。需要确保用户理解立体校正的目的和重映射函数在此过程中的作用。</think>双目摄像头经过`cv2.remap()`重映射处理后,左右图像的关系取决于**立体校正的标定参数**,通常左右图像会经过几何变换实现**极线对齐**,但左右图像的内容并不完全相同,而是保留视差信息以支持深度计算。以下是详细分析: --- ### 1. 重映射的目的与原理 双目摄像头由于物理安装位置差异,左右图像存在**几何畸变**和**视角差异**。通过标定获取的**畸变参数**和**立体校正映射表**,`cv2.remap()`会将原始图像中的像素按预设的映射关系(`map1`和`map2`)重新排列,使校正后的左右图像满足以下特性: - **极线对齐**:左右图像的对应位于同一水平线上[^1]; - **消除畸变**:桶形畸变、枕形畸变等被修正; - **保留视差**:水平方向的视差保留,用于计算深度信息。 --- ### 2. 左右图像的重映射差异 - **映射参数不同**:左右摄像头有独立的映射表(`map1_left, map2_left`和`map1_right, map2_right`),因此重映射后的图像**几何形状不同**; - **内容相似但视差保留**:校正后左右图像中同一物体的水平坐标差异(视差)反映深度信息,但垂直坐标一致; - **示例**:若标定正确,左图中的$(x,y)$对应右图中的$(x-d,y)$,其中$d$为视差。 --- ### 3. 验证方法 通过代码观察左右图像的重映射效果: ```python import cv2 import numpy as np # 加载标定参数(示例) left_map1, left_map2 = np.load("left_maps.npy") # 左摄像头映射表 right_map1, right_map2 = np.load("right_maps.npy") # 右摄像头映射表 # 读取原始左右图像 left_img = cv2.imread("left.png") right_img = cv2.imread("right.png") # 应用重映射 left_remap = cv2.remap(left_img, left_map1, left_map2, cv2.INTER_LINEAR) right_remap = cv2.remap(right_img, right_map1, right_map2, cv2.INTER_LINEAR) # 显示结果(水平拼接对比) combined = np.hstack((left_remap, right_remap)) cv2.imshow("Remapped Images", combined) cv2.waitKey(0) ``` **输出结果**:左右图像的行对齐,但水平方向存在视差,验证两者内容不同。 --- ### 4. 关键结论 | 特性 | 左图像 | 右图像 | |---------------------|---------------------------|---------------------------| | 几何形状 | 校正为无畸变的平面 | 同左 | | 像素内容 | 包含左视角信息 | 包含右视角信息 | | 视差方向 | 水平方向保留差异 | 水平方向保留差异 | ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值