鱼眼相机模型-MEI

参考文献: Single View Point Omnidirectional Camera Calibration from Planar Grids

  1. 相机模型如下:
cpp 复制代码
   // 相机坐标系下的点投影到畸变图像
   // 输入:相机坐标系点坐标cam  输出: 畸变图像素点坐标disPt
   void FisheyeCamAdapter::cam2DistImg(cv::Point3f &cam, cv::Point2f &disPt)
    {
        double r = cv::norm(cam);
        double dx_u = 0, dy_u = 0;
        if (r != 0)
        {
            cv::Point3f ps = cam / r;
            double x = ps.x / (ps.z + camInt.fXi);
            double y = ps.y / (ps.z + camInt.fXi);
            distortion(x, y, &dx_u, &dy_u);
            x += dx_u;
            y += dy_u;
            disPt.x = x * camInt.fGammaX + camInt.fCx;
            disPt.y = y * camInt.fGammaY + camInt.fCy;
        }
        else
        {
            disPt.x = camInt.fCx;
            disPt.y = camInt.fCy;
        }
    }
    // 无畸变图像到畸变图像
    void FisheyeCamAdapter::distortion(double mx_u, double my_u, double *dx_u, 
         double *dy_u)
    {
        double mx2_u = 0., my2_u = 0., mxy_u = 0., rho2_u = 0., rad_dist_u = 0.;

        double k1 = camInt.distortCoeff[0];
        double k2 = camInt.distortCoeff[1];
        double p1 = camInt.distortCoeff[2];
        double p2 = camInt.distortCoeff[3];
        double k5 = camInt.distortCoeff[4];

        mx2_u = mx_u * mx_u;
        my2_u = my_u * my_u;
        mxy_u = mx_u * my_u;
        rho2_u = mx2_u + my2_u;
        rad_dist_u = k1 * rho2_u + k2 * rho2_u * rho2_u + k5 * rho2_u * rho2_u * 
        rho2_u;
        *dx_u = mx_u * rad_dist_u + 2 * p1 * mxy_u + p2 * (rho2_u + 2 * mx2_u);
        *dy_u = my_u * rad_dist_u + 2 * p2 * mxy_u + p1 * (rho2_u + 2 * my2_u);
    }

反投影过程:畸变图中的像素坐标计算相机坐标系下坐标

cpp 复制代码
    cv::Point3f FisheyeCamAdapter::pointDis2Camera(const cv::Point2f &disPoint)
    {
        double mx_d, my_d, mx_u, my_u;
        double lambda;

        double xi = camInt.fXi;
        // Lift points to normalised plane
        float inv_K11 = 1 / camInt.fGammaX;
        float inv_K13 = -camInt.fCx / camInt.fGammaX;
        float inv_K22 = 1 / camInt.fGammaY;
        float inv_K23 = -camInt.fCy / camInt.fGammaY;
        mx_d = inv_K11 * (disPoint.x) + inv_K13;
        my_d = inv_K22 * (disPoint.y) + inv_K23;
        undistortGN(mx_d, my_d, &mx_u, &my_u, 100); // 去畸变坐标
        // Lift normalised points to the sphere (inv_hslash)
        cv::Point3f camera;
        if (xi == 1)
        {
            lambda = 2 / (mx_u * mx_u + my_u * my_u + 1);
            camera.x = lambda * mx_u;
            camera.y = lambda * my_u;
            camera.z = lambda - 1;
        }
        else
        {
            double sqrt_i = 1.0 + (1.0 - xi * xi) * (mx_u * mx_u + my_u * my_u);
            if (sqrt_i < 0)
            {
                camera.x = -1000000;
                camera.y = -1000000;
                camera.z = 1;
            }
            else
            {
                lambda = (xi + sqrt(sqrt_i)) / (1.0 + mx_u * mx_u + my_u * my_u);
                camera.x = lambda * mx_u;
                camera.y = lambda * my_u;
                camera.z = lambda - xi;
            }
        }
        return camera;
    }
相关推荐
AI医影跨模态组学4 分钟前
如何将深度学习MTSR与膀胱癌ITGB8/TGF-β/WNT机制建立关联,并进一步解释其与患者预后及肿瘤侵袭、免疫抑制的生物学联系
人工智能·深度学习·论文·医学影像
搬砖的前端23 分钟前
AI编辑器开源主模型搭配本地模型辅助对标GPT5.2/GPT5.4/Claude4.6(前端开发专属)
人工智能·开源·claude·mcp·trae·qwen3.6·ops4.6
Python私教1 小时前
Hermes Agent 安全加固与生态扩展:2026-04-23 更新解析
人工智能
饼干哥哥1 小时前
Kimi K2.6 干成了Claude Design国产版,一句话生成电影级的动态品牌网站
人工智能
肖有米XTKF86461 小时前
带货者精品优选模式系统的平台解析
人工智能·信息可视化·团队开发·csdn开发云
天天进步20151 小时前
打破沙盒限制:OpenWork 如何通过权限模型实现安全的系统级调用?
人工智能·安全
xcbrand1 小时前
政府事业机构品牌策划公司找哪家
大数据·人工智能·python
骥龙1 小时前
第十篇:合规与未来展望——构建AI智能体安全标准
人工智能·安全
薛定e的猫咪1 小时前
AI 辅助科研工具全景指南:计算机与金融领域(2025-2026)
人工智能·金融·ai编程·ai写作
xiaozhazha_1 小时前
企业级AI CRM安全架构深度解析:从OpenClaw风险到快鹭智能CRM的“四重护栏”实践
人工智能·安全·安全架构