OpenCV找到畸变校正后的图像像素在原图对应位置

因为一些扯淡的原因,需要得到畸变校正后图像像素和校正前图像的像素的一一对应关系。这个扯淡的原因当然是优化老版本的算法但是又不能乱改接口。

正文

这篇博文有一点介绍但是不太符合我的期望,所以我想到了一种方法可以尝试一下(其实这种方法在别的地方早就用过的):构造一个和原图一样大小的双通道图像,图像通道内的值分别是该点的坐标。然后和原图进行一样的坐标变化,尽量不改变坐标内的值,比如遇到 cv::INTER_LINEAR尽量改成最近邻差值(其实用线性插值也没什么影响,个人感觉最近邻插值更好点,当然只是感觉。这种感觉估计还不对。反正差的话也就是1个像素以内)然后可以得到:(还挺好看)
在这里插入图片描述
这样的一张图,放大看:
在这里插入图片描述
对应的像素,这时候只要和原图进行一样的坐标变换,就可以通过它知道原图每个像素分别跑到哪里去了。于是乎:

在这里插入图片描述

cv::Mat posLeft(SJ_Left.size(), CV_32SC2, cv::Scalar::all(0)), posLeft_Homo, posRght;
	for (int i = 0; i < SJ_Left.rows; i++) {
		for (int j = 0; j < SJ_Left.cols; j++) {
			posLeft.at<cv::Vec2i>(i, j)[0] = i;	//y
			posLeft.at<cv::Vec2i>(i, j)[1] = j;	//x
		}
	}
	cv::split(posLeft, channels);
	posRght = posLeft.clone();
	cv::undistort(posLeft, posLeft, intrinsic_matrix1, distortion_coeffs1);

定位到cv::undistort()源码, 试试单通道:
在这里插入图片描述
把源码抠出来,发现两个地方出问题:
在这里插入图片描述
在这里插入图片描述
感兴趣的同学自己去看源码,这里不深入搞了,线上在催,我没空写了,直接扔出来解决方案:删了多余的,改数据类型:
把用来做定位的图换成:CV_32FC2就搞定了,但是: 这么做好像还不对
在这里插入图片描述
因为我按照像素找几个亮点去找对应检验时候发现是不对的,十有八九是remap时候在线性插值整的两个通道数据混了。 这里码一下,这个问题我没深究,所以我在文章开头说了推荐最近邻插值,不用线性插值,谁知道源码里面在算映射灰度时候对双通道图像用的是什么规则做的映射,这里最近邻插值只要改一下remap的参数就行。 但是好像也不是那么准,我用的方法:分离两个通道分别做映射:(而且用的undistort)
在这里插入图片描述
放大看:
在这里插入图片描述
在这里插入图片描述
对比就知道,第一通道就是变换后对应的灰度值,后两个通道就是该像素在原图的坐标。
搞定收工。

### 回答1: OpenCV图像畸变校正是一种图像处理方法,用于纠正图像中由于摄像头镜头畸变引起的失真。 畸变分为径向畸变和切向畸变两种。径向畸变是由于镜头的曲率不均匀而引起的,主要表现为图像中心附近的特征点扩散或收缩。切向畸变是由于镜头与图像平面不平行而引起的,主要表现为图像中心附近的特征点偏移。 为了校正图像畸变,首先需要获取相机的内部参数矩阵。这些参数包括焦距、主点坐标和畸变系数。然后,可以通过使用这些参数计算出畸变校正的映射函数。 畸变校正的映射函数是根据径向畸变和切向畸变的模型进行计算的。对于径向畸变,可以使用二项式模型进行建模。对于切向畸变,可以使用仿射变换进行建模。 一旦得到畸变校正的映射函数,就可以将图像中的每个像素坐标映射到校正后的图像中的对应位置。根据映射函数的计算结果,可以通过插值算法获得对应位置像素值。 OpenCV提供了用于畸变校正的函数cv::undistort()。这个函数接受输入图像、相机内部参数矩阵和畸变系数作为输入,并返回校正后的图像。 通过使用OpenCV畸变校正函数,我们可以将镜头畸变引起的图像失真校正,得到更加真实和准确的图像。这对于计算机视觉和图像处理任务非常重要,例如物体检测、目标跟踪和三维重构等。 ### 回答2: OpenCV是一个开源的计算机视觉库,提供了一系列图像处理和计算机视觉算法。其中一个功能是图像畸变校正,可以通过使用OpenCV库中的函数来实现。 图像畸变校正校正图像中的畸变,即由于相机镜头和光学系统的特性引起的图像畸变图像畸变一般包括径向畸变和切向畸变。 径向畸变是由于相机镜头的形状引起的,使得离中心点越远的像素位置与实际位置之间有所偏差。切向畸变则是由于镜头装配不完美或相机传感器平面与光轴不平行导致的图像失真。 校正图像畸变的步骤如下: 1. 从相机或设备获取图像。 2. 检测并识别相机的内标定参数,包括相机的焦距、畸变系数等。 3. 利用相机内参和外参,根据畸变模型计算每个像素畸变向量。 4. 对每个像素点应用畸变向量,将其映射到没有畸变位置。 5. 可以选择进行裁剪,将不需要的黑边去除,得到校正后的图像OpenCV中提供了函数cv::undistort()来实现图像畸变校正。该函数需要输入畸变图像、相机的内标定参数矩阵、畸变系数等作为输入,然后返回校正后的图像。 总而言之,OpenCV提供了实现图像畸变校正的函数,可以便捷地对图像进行畸变校正,提高图像的质量和准确性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值