undistortPoints()函数用法总结

undistortPoints()函数用法总结

  函数调用:C++: void undistortPoints(InputArray src, OutputArray dst, InputArray cameraMatrix, InputArray distCoeffs, InputArrayR=noArray(), InputArray P=noArray())
  参数说明:
这里写图片描述
  特别说明:
这里写图片描述
  实现功能:通过旋转平移变换,将观察点转换到理想的点坐标下。
  用法举例:

  bool CoreAlgorithm::findPntsWithTagVStrong(vector<Point2f> &centerPnt, vector<float>& longaxisRadius, vector<TagPoint2f>& tagPnts, float &firstFeaturelength, const double gamma, Mat cameraMatrix,double angle)
{
    /added by QiYong///
    //利用undistortPoints()函数将拍摄的图像矫正为正常的视角,便于检测。
    if (centerPnt.size() != 8)
    {
        return false;
    }
    vector<Point2f>  DistortCenterPnt;
    double k1 = 0;
    double k2 = 0;
    double k3 = 0;
    double k4 = 0;
    vector<double> Distort_Coefficients;
    Distort_Coefficients.push_back(k1);
    Distort_Coefficients.push_back(k2);
    Distort_Coefficients.push_back(k3);
    Distort_Coefficients.push_back(k4);
    Mat Rx = (Mat_<double>(3, 3) << 1, 0, 0, 0, cos(angle), -sin(angle), 0, sin(angle), cos(angle));
    Mat Ry = (Mat_<double>(3, 3) << cos(angle), 0, sin(angle), 0, 1, 0, -sin(angle), 0, cos(angle));
    Mat Rz = (Mat_<double>(3, 3) << cos(angle), -sin(angle), 0, sin(angle), cos(angle), 0, 0, 0, 1);
    Mat R = Rx*Ry;
    undistortPoints(centerPnt, DistortCenterPnt, cameraMatrix, Distort_Coefficients, R);
**///需要将变换后的点先变化为齐次坐标系,然后还需要乘以相机参数矩阵,才是最终的变化的坐标。**
    Mat centerPntsThreeCols = Mat::zeros(8, 3, CV_64FC1);
    for (size_t i = 0; i < centerPnt.size(); i++)
    {
        centerPntsThreeCols.at<double>(i, 0) = DistortCenterPnt[i].x;
        centerPntsThreeCols.at<double>(i, 1) = DistortCenterPnt[i].y;
        centerPntsThreeCols.at<double>(i, 2) = 1;
    }
    Mat undistortCenterThreeCols = cameraMatrix*centerPntsThreeCols.t();
    vector<Point2f> undistortCenterPnts;
    for (size_t i = 0; i < centerPnt.size(); i++)
    {
        Point2f Point = Point2f(undistortCenterThreeCols.at<double>(0, i), undistortCenterThreeCols.at<double>(1, i));
        undistortCenterPnts.push_back(Point);
    }
    Mat img1 = Mat::zeros(1500, 1500, CV_64FC1);
    Mat img2 = Mat::zeros(1500, 1500, CV_64FC1);
    for (size_t i = 0; i < centerPnt.size(); i++)
    {
        DrawEllipse(img1, centerPnt[i].x, centerPnt[i].y, 5, 5, 0);
        DrawEllipse(img2, undistortCenterPnts[i].x -500, undistortCenterPnts[i].y, 5, 5, 0);
    }
    namedWindow("源中心点", 2);
    namedWindow("矫正后的中心点", 2);
    imshow("源中心点", img1);
    imshow("矫正后的中心点", img2);
    waitKey();
    imwrite("D:/1.bmp", img1);
    imwrite("D:/2.bmp", img2);
}

  程序运行结果:
  原来的中心点排布如下:
这里写图片描述

  经过undistortPoints()旋转变换后的中心点排布如下:`

这里写图片描述

  注:代码中加粗的部分为常常会犯错误的地方。

  个人公众号:

这里写图片描述

3D视觉工坊 CSDN认证博客专家 算法 3D视觉
个人公众号:3D视觉工坊。公众号特邀嘉宾及合伙人,先后就职于国内知名研究机构、自动驾驶公司、海康研究院,主要研究方向为深度学习、目标检测、语义分割、图像处理、自动驾驶感知算法等,CSDN博客专家。博主先后任职于国内知名研究院、知名大厂,致力于3D视觉算法、VLAM算法开发,涉及相机标定、手眼标定、结构光、点云后处理、三维重建等相关领域的研究,同时也是CSDN博客专家。3D视觉工坊坚持原创,近一年来输出了非常多的高质量文章,获得了粉丝的一致好评,我们将始终坚持走原创路线,打造一个铁杆粉丝的聚集区。
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值