【图像】【OpenCV鱼眼矫正】一、 主要API解读

一、代码流程

用OpenCV进行鱼眼相机矫正的代码很多,大家可以上网搜索,也可以下载博主的代码

但是,不管参考哪家程序,用到的主要API总是这三个:

- fisheye::calibrate();  //标定相机,获取内参、外参、畸变系数   
- fisheye::initUndistortRectifyMap();  //利用内参和畸变系数,获取重投影矩阵
- remap(); //根据重投影矩阵,对畸变图像进行重投影,获得矫正图

下面将简要介绍各函数的功能。

1. fisheye::calibrate();

fisheye::calibrate函数在OpenCV中的声明如下:

double cv::fisheye::calibrate	(	InputArrayOfArrays 	  objectPoints,
									InputArrayOfArrays 	  imagePoints,
									const Size & 	      image_size,
									InputOutputArray 	  K,
									InputOutputArray 	  D,
									OutputArrayOfArrays   rvecs,
									OutputArrayOfArrays   tvecs,
									int 		          flags = 0,
									TermCriteria 	      criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 100, DBL_EPSILON) 
)	

其中各形参的作用在网上有很多文章介绍,本文不再赘述。

这里只简单介绍其输入输出

输入:

  • 一幅/多幅产生鱼眼畸变的棋盘格图像
  • 其他参数

输出:

  • 内参K
  • 旋转向量rvecs
  • 平移向量tvecs
  • 畸变系数D

关于相机内参、外参(旋转向量+平移向量)的作用,请读者上网学习世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系,本文也不再赘述。

这里只给出如下公式:

以上公式是对一个正常的、无畸变的相机所成立的,因此没有用到畸变系数D

而鱼眼相机的畸变,就发生在相机坐标系像素坐标系的转换过程中。

2. fisheye::initUndistortRectifyMap();

fisheye::initUndistortRectifyMap()的作用是根据无畸变图的像素位置(i, j),推出它对应的畸变图中的像素位置(x, y),然后把畸变图中的(x, y)复制到新图中的(i, j),就得到了矫正图像。

fisheye::initUndistortRectifyMap()函数在OpenCV中的声明如下:

void cv::fisheye::initUndistortRectifyMap	(	InputArray 	K,
												InputArray 	D,
												InputArray 	R,
												InputArray 	P,
												const cv::Size & 	size,
												int 	m1type,
												OutputArray 	map1,
												OutputArray 	map2 
)	

其中各形参的作用在网上有很多文章介绍,本文不再赘述。

这里只简单介绍其输入输出

输入:

  • 内参矩阵K
  • 畸变系数D
  • R并非旋转向量/矩阵,矫正单目鱼眼相机时,R默认为单位矩阵
  • 若想使矫正后图片对应的内参与原相机内参不同,则把P设为新内参;否则,P与原内参相同
  • 输出矩阵map1的类型m1type
  • 其他参数

输出:

  • map1
  • map2

我们通常把参数m1type设为CV_16SC2时,此时最重要的输出是map1

根据CV_16SC2,map1此时是一个2通道的矩阵,每个点(i, j)都是一个2维向量,包含:

  • (i, j) [0]
  • (i, j) [1]

现在,我们令x = map1(i, j)[0], y= map1(i, j)[1]

那么,ijxy的含义是:

畸变图中坐标为(x, y)的像素点,在无畸变图中应该处于(i, j)位置。

这样,把畸变图(x, y)处的像素复制到(i, j)处,就得到了矫正后的图像。

即如下图所示:

而此时的map2是为了做插值、让矫正后图像更清晰而用,本文不做介绍。


注:

若把参数m1type设为CV_32FC1,则此时map1不再是二通道矩阵,而是一通道矩阵

此时map1保存m1typeCV_16SC2map10通道,map2保存m1typeCV_16SC2map11通道。

即,此时令x = map1(i, j),y = map2(i, j),那么才有:

畸变图中坐标为(x, y)的像素点,在无畸变图中应该处于(i, j)位置。


3. remap()

remap()函数在OpenCV中的声明如下:

void cv::remap	(	InputArray 	src,
OutputArray 	dst,
InputArray 	map1,
InputArray 	map2,
int 	interpolation,
int 	borderMode = BORDER_CONSTANT,
const Scalar & 	borderValue = Scalar() 
)	

其中各形参的作用在网上有很多文章介绍,本文不再赘述。

这里只简单介绍其输入输出

输入:

  • 鱼眼畸变图src
  • map1
  • map2
  • 其他参数

输出:

  • 矫正后的图像dst

remap()函数其实就是根据fisheye::initUndistortRectifyMap()生成的map1,如本文在上图中描述的那样,把畸变图src中坐标为(map1(i, j)[0], map1(i, j)[1])的点投影到输出图像dst的(i, j)处;再根据map2做一些清晰化处理,就完成了矫正。

  • 13
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 鱼眼畸变是由鱼眼相机广角镜头的特性引起的一种畸变现象。在图像中,直线变得弯曲并且物体的边缘拉伸。 OpenCV提供了一种用于鱼眼畸变矫正的函数,称为`cv2.fisheye.undistortImage()`。该函数可以将畸变图像转换为非畸变的图像。 使用该函数需要提供畸变图像、相机的内参矩阵和畸变参数。内参矩阵包括焦距和光学中心等参数,通常通过相机标定得到。畸变参数包括径向畸变和切向畸变等,同样也需要通过相机标定获得。 以下是使用OpenCV进行鱼眼畸变矫正主要步骤: 1. 读取畸变图像和相机的内参矩阵和畸变参数。 2. 创建输出图像的尺寸和类型。 3. 调用`cv2.fisheye.undistortImage()`函数,传入畸变图像、内参矩阵和畸变参数,以及输出图像。 4. 显示和保存矫正后的图像。 需要注意的是,畸变矫正的效果取决于相机的标定质量和参数的准确性。在进行鱼眼畸变矫正之前,最好对相机进行标定,以获取准确的内参矩阵和畸变参数。 OpenCV鱼眼畸变矫正功能可以广泛应用于计算机视觉图像处理领域,例如机器人导航、三维重建和全景图像拼接等。 ### 回答2: 鱼眼畸变矫正是一种在计算机视觉中常用的技术,可以通过对图片进行处理,将鱼眼相机拍摄的图像转换为透视图像,使图像中的直线保持直线,更符合人眼看到的实际情况。 OpenCV是一个开源的计算机视觉库,提供了许多图像处理和计算机视觉相关的函数和工具。在OpenCV中,也提供了鱼眼畸变矫正的函数来实现这一功能。 鱼眼畸变矫正的过程通常分为两步:参数估计和图像转换。 参数估计阶段主要是根据鱼眼相机的特性,估计出畸变的参数。OpenCV提供了一些函数,如`findChessboardCorners`和`calibrateCamera`等,可以通过拍摄棋盘格样板并基于棋盘格图像的角点位置,估计相机的标定矩阵和畸变系数。 图像转换阶段使用估计出的参数,对图像进行畸变矫正OpenCV提供了函数`undistort`来完成这个任务。该函数接受源图像、畸变参数和标定矩阵作为输入,并输出矫正后的图像。 使用OpenCV进行鱼眼畸变矫正的步骤如下:首先,使用相机拍摄一系列棋盘格图片,并检测角点位置。然后,利用检测到的角点位置和已知的棋盘格尺寸,使用`calibrateCamera`函数估计相机的标定矩阵和畸变系数。最后,对要矫正图像应用`undistort`函数,得到畸变校正后的图像。 通过OpenCV提供的鱼眼畸变矫正功能,我们可以清晰地看到鱼眼相机拍摄的图像中的物体和线条,使其更加符合真实的显示效果。 ### 回答3: OpenCV是一个开源的计算机视觉库,其中包含了很多图像处理和计算机视觉算法。其中一个功能是鱼眼畸变矫正。 在摄影中,鱼眼镜头是一种广角镜头,能够拍摄到非常宽广的景象。然而,鱼眼镜头会引入一种畸变,使得图像中的直线变为弯曲的弧线。这种畸变使图像在某些任务中变得不可用,因此鱼眼畸变矫正就变得十分重要。 鱼眼畸变矫正算法主要包括以下几个步骤: 1. 读取鱼眼图像:使用OpenCV的函数读取待处理的鱼眼图像。 2. 相机参数估计:根据鱼眼图像的特性,使用OpenCV的函数估计相机的畸变参数。这些参数包括焦距、主点和径向畸变系数等。 3. 畸变矫正:使用OpenCV的函数根据相机参数对图像进行畸变矫正处理。这个过程会根据畸变模型对图像进行重新映射,使得直线变为直线而不再弯曲。 4. 输出结果:保存或者显示经过畸变矫正后的图像。可以使用OpenCV的函数将图像保存到文件中,或者直接显示处理结果。 总结来说,OpenCV提供了强大的鱼眼畸变矫正功能,可以通过估计相机参数和对图像进行畸变矫正来减少或消除鱼眼镜头引入的畸变,从而得到更加准确和可靠的图像。这种算法在计算机视觉和机器人领域有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值