【多视几何】畸变校正公式

该博客详细介绍了OpenCV中相机校准的过程,特别是径向和切向畸变校正的原理。通过齐次坐标转换和相机参数,实现了含畸变校正的单点重投影。代码示例展示了如何使用`FULL_OPENCV`和`SIMPLE_PINHOLE`模型进行像素坐标计算。
摘要由CSDN通过智能技术生成
  • opencv 中 camera calibration 原理
  • k1, k2, k3, k4, k5, k6 径向畸变 radial distortion coefficients. p1, p2 切向畸变 tangential distortion coefficients. 更高阶不考虑
  • 畸变校正相当于在相机坐标系 Z=1 处进行某种2维映射

在这里插入图片描述

// 含畸变校正过程的单点重投影
inline Eigen::Vector2i reproject(Eigen::Vector3d point, Image image, Camera camera) {
	// 齐次世界坐标
	Eigen::Vector4d point_homo = { point[0], point[1], point[2], 1 };

	Eigen::Matrix<double, 3, 4> RT;
	RT.leftCols<3>() = image.R;
	RT.rightCols<1>() = -image.R*image.C;

	// 相机坐标系
	Eigen::Vector3d point_cam = RT * point_homo;

	// 归一化相机坐标
	double u = point_cam.x() / point_cam.z();
	double v = point_cam.y() / point_cam.z();

	Eigen::Vector2i reprojected;

	// "FULL_OPENCV"
	// PARAMS: fx, fy, cx, cy, k1, k2, p1, p2, k3, k4, k5, k6
	if (camera.model_id == "FULL_OPENCV") {
		// 畸变校正
		double k1 = camera.params[4];
		double k2 = camera.params[5];
		double p1 = camera.params[6];
		double p2 = camera.params[7];
		double k3 = camera.params[8];
		double k4 = camera.params[9];
		double k5 = camera.params[10];
		double k6 = camera.params[11];

		double u2 = u * u;
		double uv = u * v;
		double v2 = v * v;
		double r2 = u2 + v2;
		double r4 = r2 * r2;
		double r6 = r4 * r2;
		double radial = (1 + k1 * r2 + k2 * r4 + k3 * r6) / (1 + k4 * r2 + k5 * r4 + k6 * r6);

		u = u * radial + 2 * p1 * uv + p2 * (r2 + 2 * u2);
		v = v * radial + 2 * p2 * uv + p1 * (r2 + 2 * v2);
	
		// 像素坐标系
		double fx = camera.params[0];
		double fy = camera.params[1];
		double cx = camera.params[2];
		double cy = camera.params[3];

		reprojected[0] = std::ceil(fx*u + cx);
		reprojected[1] = std::ceil(fy*v + cy);
	}

	// "SIMPLE_PINHOLE"
	// PARAMS: f, cx, cy
	if (camera.model_id == "SIMPLE_PINHOLE") {
		double f = camera.params[0];
		double cx = camera.params[1];
		double cy = camera.params[2];

		reprojected[0] = std::ceil(f * u + cx);
		reprojected[1] = std::ceil(f * v + cy);
	}
	return reprojected;
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值