通过畸变图像的畸变系数和内参生成去畸变图像代码实现,其原理可以参考https://blog.csdn.net/w77AYU/article/details/79358751 ,注意这里的畸变模型和代码的不一样,代码的畸变模型是基于广角摄像头,畸变程度没 链接文章中鱼眼模型的那么大
#include <opencv2/opencv.hpp>
#include <string>
using namespace std;
string image_file = "./distorted.png"; // 请确 保路 径 正 确
int main(int argc, char ∗∗argv)
{
// 本 程 序 实 现 去 畸 变 部 分 的 代 码。 尽 管 我 们 可 以 调 用OpenCV的 去畸 变, 但
自己实现一遍有助于理 解。
// 畸 变 参 数
double k1 = −0.28340811, k2 = 0.07395907, p1 = 0.00019359, p2 = 1.76187114e−05;
// 内 参
double fx = 458.654, fy = 457.296, cx = 367.215, cy = 248.375;
cv::Mat image = cv::imread(image_file, 0); // 图像 是 灰 度 图,CV_8UC1
int rows = image.rows, cols = image.cols;
cv::Mat image_undistort = cv::Mat(rows, cols, CV_8UC1); // 去 畸变以后的图
// 计 算 去 畸 变 后 图 像 的 内 容
for (int v = 0; v < rows; v++)
{
for (int u = 0; u < cols; u++)
{
// 按照 公 式, 计 算 点(u,v)对 应 到 畸 变 图 像 中 的 坐 标(u_distorted, v_distorted)
double x = (u − cx) / fx, y = (v − cy) / fy;
double r = sqrt(x ∗ x + y ∗ y);
double x_distorted = x ∗ (1 + k1 ∗ r ∗ r + k2 ∗ r ∗ r ∗ r ∗ r) + 2 ∗ p1 ∗ x ∗
y + p2 ∗ (r ∗ r +2 ∗ x ∗ x);
double y_distorted = y ∗ (1 + k1 ∗ r ∗ r + k2 ∗ r ∗ r ∗ r ∗ r) + p1 ∗ (r ∗ r
+ 2 ∗ y ∗ y) + 2 ∗ p2 ∗ x ∗ y;
double u_distorted = fx ∗ x_distorted + cx;
double v_distorted = fy ∗ y_distorted + cy;
// 赋值 (最近 邻 插 值)
if (u_distorted >= 0 && v_distorted >= 0 && u_distorted < cols && v_distorted < rows)
{
image_undistort.at<uchar>(v, u) = image.at<uchar>((int) v_distorted, (int) u_distorted);
}
else
{
image_undistort.at<uchar>(v, u) = 0;
}
}
}
// 画 图 去 畸 变 后 图 像
cv::imshow("distorted", image);
cv::imshow("undistorted", image_undistort);
cv::waitKey();
return 0;
}