针孔相机的畸变模型与OpenCV手动去畸变代码详解
创作时间:
作者:
@小白创作中心
针孔相机的畸变模型与OpenCV手动去畸变代码详解
引用
CSDN
1.
https://blog.csdn.net/z1309348145/article/details/139029083
在计算机视觉和图像处理领域,相机畸变是一个常见的问题。本文将详细介绍针孔相机的畸变模型,包括径向畸变和切向畸变,并通过OpenCV实现手动去畸变的完整代码。
为什么要加入透镜?
小孔成像当然简单,但是只有一条光线投射到胶片上,图像暗淡。透镜将多条光线聚焦到胶片上,增加了照片的亮度,但同时会带来畸变、失焦等影响。
针孔相机的畸变模型
径向畸变
在实际拍摄的照片中,摄像机的透镜使得真实环境中的一条直线在图片中变成了曲线(往里弯称桶形畸变;往外弯称枕形畸变)。越靠近图像的边缘,这种现象越明显。由于实际的透镜往往是中心对称的,这使得不规则的畸变通常径向对称。主要分为桶形畸变和枕形畸变。
数学模型:
r=x^2+y^2
此处x,y,xd,yd均为归一化像平面上的坐标。
切向畸变
机械组过程中,透镜和成像平面不平行会引入切向畸变。
数学模型:
r=x^2+y^2
此处x,y,xd,yd均为归一化像平面上的坐标。
归一化像平面
实际上我们使用的针孔相机模型是假设成像位置在相机前方z=f的平面上,否则成像为倒像,且会带来负号,会使模型复杂,相机为我们把图像自动转化成了正向,也简化了模型。相机前方z=1的平面称为归一化像平面,畸变模型是在归一化像平面上讨论的。
畸变过程和去畸变过程
畸变过程
- 三维空间点先投影到归一化像平面(如上图所示),归一化坐标为[x,y]T。
- 对归一化平面上的点计算径向畸变和切向畸变。
- 将畸变后的点通过内参数矩阵投影到像素平面。
ud = fx*xdistorted+cx
vd = fy*ydistorted+cy
此处ud,vd为畸变图像上像素点坐标,现要找到ud,vd对应的无畸变像素点,然后赋值即可。
去畸变
新建一张空白图像,该图像为无畸变的像素点存储图像,遍历空白图像上的每一个像素点,找到对应的发生畸变后的对应像素点。
- 将空白图像上的每一个像素点(设W,H)投影到归一化像平面。
x = (W-cx)/fx y = (H-cy)/fy
- 模拟畸变过程,找到发生畸变后的对应点(与畸变过程2 3一致)。
ud = fx*xdistorted+cx
vd = fy*ydistorted+cy
- 将ud,vd赋值给空白图像上的W,H位置上的像素点,即可完成去畸变。
OpenCV代码实现(xu,yu即x,y,代表归一化平面无畸变点坐标)
没有用到k3和p1,p2,需要使用只需加上即可
#include <opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src,gray;
src = imread("C://Users/86182/Desktop/新建文件夹/16.bmp");
cvtColor(src, gray, COLOR_BGR2GRAY);
Mat trans = Mat::zeros(240, 320, CV_8UC1);
float xu, yu,xd,yd,r,cx = 148.2546,cy=122.5429,fx = 282.971,fy = 282.1993;
float k1 = -0.4082, k2 = 0.2088;
int ud, vd;
for (int H = 0; H < gray.rows ; H++)
for (int W = 0; W < gray.cols; W++)
{
xu = (W - cx) / fx;
yu = (H - cy) / fy;
r = sqrt(xu * xu + yu * yu);
xd = xu * (1 + k1 * r * r + k2 * r * r * r * r);
yd = yu * (1 + k1 * r * r + k2 * r * r * r * r);
ud = (xd * fx + cx);
vd = (yd * fy + cy);
if (ud >= 0 && vd >= 0 && ud < gray.cols && vd < gray.rows)
trans.ptr<uchar>(H)[W] = gray.ptr<uchar>(vd)[ud];
}
return 0;
}
效果
热门推荐
张锦秋:用建筑设计诠释中国传统文化
西安博物院镇馆之宝:西周永盂与唐三彩腾空马的传奇
高血糖患者需谨慎:这5种水果暗藏升糖风险
墨菲定律教你化解婆媳关系中的那些“坑”
法甲第18轮前瞻:欧塞尔主场迎战里尔,谁能打破近期不胜怪圈?
欧塞尔VS里尔:谁将笑到最后?
肿瘤与癌症:一字之差,天壤之别
正确认识癌症:从预防到治疗的全面指南
法甲第18轮:欧塞尔主场迎战里尔,谁能笑到最后?
法甲第17轮前瞻:欧塞尔主场迎战里尔,伤停困扰下能否逆袭?
法甲第17轮:欧塞尔主场迎战里尔,谁能笑到最后?
法甲第17轮前瞻:欧塞尔主场迎战里尔,谁能笑到最后?
春节倒计时,书法达人教你写春联
朱元璋与春联:从皇家到民间的千年传承
春联创作,诗词也能玩出新花样?
春节倒计时:春联创作技巧大揭秘
何绍基春联:2025春节必备的文化瑰宝
霸王龙是夜行动物?揭秘电影与科学中的恐龙真相
方舟生存进化:霸王龙召唤代码及驯服技巧全攻略
方舟生存进化:精英霸王龙召唤全攻略,代码和驯服详解
方舟生存进化"恐惧升腾"活动上线,限定皮肤等你来
2024年哈尔滨冰雪旅游迎客破千万,收入增235%创新高
2025西安春节:54天灯会点亮千年古都
首个“非遗春节”带动文旅热潮,冰雪游、避寒游持续升温
马伯庸支招:中考作文满分秘籍
中考作文提分秘籍:如何快速提升?
中考作文如何写出真情实感?
中考临近,教你摆脱紧张情绪
张大爷的分床睡:老年夫妻的睡眠与情感如何平衡?
红烧肉新吃法:从烧蛋到焖饭,传统美味的创意变身