通过opencv3.0 生成去畸变图像

通过畸变图像的畸变系数和内参生成去畸变图像代码实现,其原理可以参考https://blog.csdn.net/w77AYU/article/details/79358751   ,注意这里的畸变模型和代码的不一样,代码的畸变模型是基于广角摄像头,畸变程度没 链接文章中鱼眼模型的那么大

#include 
#include 
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(v, u) = image.at((int) v_distorted,     (int)         u_distorted);
             } 
             else
             {
                 image_undistort.at(v, u) = 0;
             }
         }
     }

 // 画 图 去 畸 变 后 图 像
 cv::imshow("distorted", image);
 cv::imshow("undistorted", image_undistort);
 cv::waitKey();
 return 0;
 }

 

你可能感兴趣的:(机器视觉,图像处理)