畸变(相机标定之畸变矫正与反畸变计算)
作者:佚名 来源:哪吒游戏网 2020-03-27 03:02:42
畸变(相机标定之畸变矫正与反畸变计算),哪吒游戏网给大家带来详细的畸变(相机标定之畸变矫正与反畸变计算)介绍,大家可以阅读一下,希望这篇畸变(相机标定之畸变矫正与反畸变计算)可以给你带来参考价值。
相机标定问题已经是比较成熟的问题,OpenCV中提供了比较全面的标定、矫正等函数接口。但是如果我想通过一张矫正好的图像,想获得原始的畸变图畸变,却没有比较好的方法,这里讨论了点的畸变和反畸变问题。
1.问题提出:给定一些已经经过矫正的二维点集,如何获得矫正前带畸变的二维点集?
2.理论基础:理论基础无它,就是相机的小孔成像模型和畸变参数模型,

这里需要注意,k1,k2等为径向畸变参数,p1,p2为切向畸变参数,s1,s2为薄棱镜畸变参数(常忽略),x'为理想的无畸变的图像像素坐标或者点(Points)坐标,x''是带透镜畸变参数的图像像素或点坐标,上述公式详尽表达了它们之间的关系。通俗点讲,x',y'是指通过针孔模型求出来的理想点的位置,x'',y''是其真实位置,所以要通过后面的畸变模型进行近似畸变,获得x'',y''的值,但是在实际应用时,x'',y''通常是已知的,即我们通过相机获得了带畸变的图像,但是我们需要反算回去得到x',y',OpenCV提供了这样的过程函数接口,可以直接使用。
而这里想做的是通过矫正图得到畸变图点,即通过x‘,y’得到x'',y'',所以只要通过上述公式进行求解就行了。
3.求解过程:
直接给出相关程序:
void myDistortPoints(const std::vector<cv::Point2d> & src, std::vector<cv::Point2d> & dst, const cv::Mat & cameraMatrix, const cv::Mat & distortionCoeff) { dst.clear(); double fx = cameraMatrix.at<double>(0, 0); double fy = cameraMatrix.at<double>(1, 1); double ux = cameraMatrix.at<double>(0, 2); double uy = cameraMatrix.at<double>(1, 2); double k1 = distortionCoeff.at<double>(0, 0); double k2 = distortionCoeff.at<double>(0, 1); double p1 = distortionCoeff.at<double>(0, 2); double p2 = distortionCoeff.at<double>(0, 3); double k3 = distortionCoeff.at<double>(0, 4); double k4;// double k5;// double k6;// for (unsigned int i = 0; i < src.size(); i++) { const cv::Point2d & p = src[i];
//获取的点通常是图像的像素点,所以需要先通过小孔相机模型转换到归一化坐标系下; double xCorrected = (p.x - ux) / fx; double yCorrected = (p.y - uy) / fy; double xDistortion, yDistortion;
//我们已知的是经过畸变矫正或理想点的坐标; double r2 = xCorrected*xCorrected + yCorrected*yCorrected; double deltaRa = 1. + k1 * r2 + k2 * r2 * r2 + k3 * r2 * r2 * r2; double deltaRb = 1 / (1. + k4 * r2 + k5 * r2 * r2 + k6 * r2 * r2 * r2); double deltaTx = 2. * p1 * xCorrected * yCorrected + p2 * (r2 + 2. * xCorrected * xCorrected); double deltaTy = p1 * (r2 + 2. * yCorrected * yCorrected) + 2. * p2 * xCorrected * yCorrected;
//下面为畸变模型; xDistortion = xCorrected * deltaRa * deltaRb + deltaTx; yDistortion = yCorrected * deltaRa * deltaRb + deltaTy;
//最后再次通过相机模型将归一化的坐标转换到像素坐标系下; xDistortion = xDistortion * fx + ux; yDistortion = yDistortion * fy + uy; dst.push_back(cv::Point2d(xDistortion, yDistortion)); } }
4.存在的问题:经过上面的过程,我们就获得了在畸变原图中点的坐标,但是有一点值得注意的是,我们将获得的畸变图中的点经过OpenCV提供的UndistortPoints()函数进行矫正的时候,不能得到原始的点,即这里存在误差。这种误差是由于自己写的畸变模型和OpenCV提供的畸变函数模型不同导致的,有兴趣的可以查看OpenCV源码,你会发现后面关于 r 的平方和 r 的四次方,六次方在OpenCV中都是平方项,所以计算结果存在误差,这里有两个解决办法,第一是修改上述代码,统一改成平方项;第二就是自己实现UndistortPoints函数:
总结:以上内容就是针对畸变(相机标定之畸变矫正与反畸变计算)详细阐释,如果您觉得有更好的建议可以提供给哪吒游戏网小编,畸变(相机标定之畸变矫正与反畸变计算)部分内容转载自互联网,有帮助可以收藏一下。
上一篇: 畸变(畸变是什么意思)
下一篇: 熹妃传厨房攻略(熹妃传厨房攻略,让我们一起来了解一下)
- 1 魔兽世界 考古(魔兽世界考古毁一生?这些装备幻化和坐骑值得你去玩考古)
- 2 普罗霍洛夫(卢布危机下俄土豪大甩卖 卖完豪宅卖球队)
- 3 龙之谷手柄(《龙之谷手游》手柄怎么连接 柄连接教学攻略)
- 4 普罗霍洛夫(俄罗斯土豪准备20亿抛售篮网! 最烂老板是怎样炼成的?)
- 5 天联网(天联网信息科技有限公司怎么样?)
- 6 附魔大师(魔兽世界怀旧服附魔大师在哪 附魔大师位置分享介绍)
- 7 wow烹饪食谱(魔兽世界怀旧服烹饪极品食谱)
- 8 陶谦让徐州(陶谦三让徐州,世界上真有这样的好人吗?)
- 9 lol神圣之剑(LOL如果神圣之剑回归,谁最受益?第1:只要不瞎都能上钻石!)
- 10 陶谦让徐州(陶谦三让徐州的原因是什么?)
- 魔兽世界 考古(魔兽世界考古毁一生?这些装备幻化和坐骑值得你去玩考古)
- 龙之谷手柄(《龙之谷手游》手柄怎么连接 柄连接教学攻略)
- 绝地求生国服绑定(《绝地求生》绑定国服不会对steam账号有任何影响)
- 绝地求生国服绑定(国服吃鸡不要钱!《绝地求生》QQ绑定Steam详细教程)
- 五指山在哪里(现实中真正的五指山,被称为沙漠之手,你知道在哪里吗?)
- 伊邪那岐(伊邪那岐与伊邪那美的形象解读)
- 五指山在哪里(五指山在哪里 五指山有什么特色玩法)
- 伊邪那岐(【分析】伊邪那岐和伊邪那美的漏洞设定)
- 伊邪那岐(阴阳师伊邪那岐原画一览 伊邪那岐高清图片欣赏)
- 天命奇御(天命奇御|正版购买|凤凰游戏|FHYX.com)

机械战警
坦克射击
梦道满V版
火箭精英3d免费版
太古灵诀
小小帝国无敌破解版
厉害了我的娃
乐高无限
侠影双剑九游版