这段 C++ 代码旨在实现图像去畸变的功能,虽然 OpenCV 本身提供了现成的去畸变函数,但通过自己手动实现该过程有助于深入理解图像畸变及去畸变的原理。p2 进行相应的数学计算,得到畸变后的坐标。通过 (u - cx) / fx 和 (v - cy) / fy 分别计算出 x 和 y 坐标,这是后续进行畸变计算的基础。此时,这个矩阵中的元素初始值是未定义的,需要通过具体的去畸变算法来填充相应的像素值。实现图像去畸变的核心算法,到最后的图像展示及正常结束程序,构成了一个较为完整的基于 OpenCV 的图像去畸变处理流程。它使得图像显示窗口能够一直保持在屏幕上,直到用户进行了按键操作,这样就给用户留出了足够的时间来仔细观察和对比两个图像的细节内容。
double fx = 458.654, fy = 457.296, cx = 367.215, cy = 248.375;:这几个变量定义了相机的内参,fx 和 fy 分别是在 x 轴和 y 轴方向上的焦距(以像素为单位),它们反映了相机将三维世界中的物体投影到二维图像平面上的缩放比例关系;cx 和 cy 是图像中心的坐标(通常以像素为单位),也就是光轴与图像平面交点对应的像素位置,相机内参对于将图像坐标和实际的物理世界坐标进行转换等操作起着关键作用。其中,前面部分 x * (1 + k1 * r * r + k2 * r * r * r * r) 和 y * (1 + k1 * r * r + k2 * r * r * r * r) 体现了径向畸变的影响,后面的 2 * p1 * x * y + p2 * (r * r + 2 * x * x) 以及 p1 * (r * r + 2 * y * y) + 2 * p2 * x * y 部分体现了切向畸变的影响,这里综合考虑了径向畸变和切向畸变因素,通过给定的畸变参数 k1、尽管我们可以调用OpenCV的去畸变,但自己实现一遍有助于理解。特别地,当前路径是相对路径(相对于可执行程序所在的目录),实际应用中根据情况也可以使用绝对路径。
整个程序从图像读取、这里需要确保路径的正确性,否则后续的图像读取操作会失败。
// 计算去畸变后图像的内容 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; } } }
for (int v = 0; v < rows; v++) { 和 for (int u = 0; u < cols; u++) {:这两层嵌套的 for 循环构成了遍历原始图像所有像素点的结构。p1、格式不支持等原因),image 会是一个空的 cv::Mat 对象。
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;:这两行代码是根据畸变模型公式来计算在存在畸变情况下,归一化平面上的坐标 (x, y) 经过畸变后对应的坐标 (x_distorted, y_distorted)。cy、