You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两椭圆切点不重合问题:Matlab计算函数异常排查求助

椭圆切点/交点计算异常排查问题

问题描述

我需要从车辆的两个椭圆平面提取消失点,使用下方Matlab函数计算两椭圆的交点与切点。该函数在第一张图像中运行正常,但在第二张图像中,前轮的交点和切点坐标计算错误。我尝试调整第二张图前轮椭圆的参数C和H,但问题仍未解决,恳请协助排查问题。

相关代码

核心计算函数

function points = ellipsesPointsSelection( C1, H1, C2, H2)
    % this function takes into account two ellipses matrices and the
    % homographies to apply to them (rotation + translation) and returns 
    % the four tangency points of the two bitangent lines to the two ellipses
    
        syms l1 l2
        l = [l1; l2; 1];
        eqns = [l.'*inv(inv(H1).'*C1*inv(H1))*l == 0, l.'*inv(inv(H2).'*C2*inv(H2))*l == 0];
        vars = [l1 l2];
        [sol_l1, sol_l2] = vpasolve(eqns, vars);

        L = [double(sol_l1.'); double(sol_l2.'); ones(1,4)];

        X = (inv(H1).'*C1*inv(H1))\L;
        Y = (inv(H2).'*C2*inv(H2))\L;
        
        pt_tng_ul = X(:,1)'; % upper (u) point (pt) tangent (tng) to the left (l) ellipse
        pt_tng_ur = Y(:,1)';
        pt_tng_dr = Y(:,2)';
        pt_tng_dl = X(:,2)';
        
        pt_cross_ul = X(:,4)'; % upper (u) point (pt) tangent (tng) to the left (l) ellipse
        pt_cross_dl = X(:,3)';
        pt_cross_dr = Y(:,4)';
        pt_cross_ur = Y(:,3)';
        
        points = [  pt_tng_ul;
                    pt_tng_ur;
                    pt_tng_dr;
                    pt_tng_dl;
                    pt_cross_ul;
                    pt_cross_ur;
                    pt_cross_dr;
                    pt_cross_dl];
    end

主调用代码

norm_matrix = diag([1, 1, 1]);% normalization off

H1 =  norm_matrix*H1; % normalized rototranslation
H2 =  norm_matrix*H2; % normalized rototranslation

ellipsesPoints = ellipsesPointsSelection(C1, H1, C2, H2);


H1_1 = norm_matrix*H1_1; % normalized rototranslation
H2_2 =  norm_matrix*H2_2; % normalized rototranslation


ellipsesPoints2 = ellipsesPointsSelection(C1_1, H1_1, C2_2, H2_2);

排查思路

  • 验证椭圆参数C的有效性:检查第二张图前轮椭圆的二次型矩阵C是否为正定矩阵(真实椭圆的必要条件),可通过eig(C)计算特征值,若存在非正特征值,说明C矩阵定义错误。同时对比拟合的椭圆与图像中实际椭圆的轮廓,确认参数拟合精度。
  • 检查单应性矩阵H的准确性:H对应椭圆所在平面的旋转变换+平移,验证H变换后的椭圆是否与图像中椭圆匹配。若H是手动输入的,需重新核对位姿参数;若H是计算得到的,检查计算过程中的位姿估计误差。
  • 修复解的顺序依赖问题:vpasolve返回的解顺序不固定,不同图像的解排列可能不同,当前代码硬编码索引(如X(:,1)对应上切点)会导致匹配错误。需添加逻辑验证每个解直线的类型:
    1. 对每条直线L,判断是公切线还是交线:公切线满足与椭圆相切(即对于椭圆矩阵E,直线L满足rank([E, L; L', 0])=3),交线则与椭圆有两个交点。
    2. 对切点,计算其在椭圆上的位置并按空间位置(如上下、左右)重新分类,而非依赖固定索引。
  • 提升数值计算稳定性:
    • 避免直接多次求逆(如inv(inv(H1).'*C1*inv(H1))),可简化为(H1')\C1\H1减少数值误差。
    • 对计算得到的点代入椭圆方程验证,若误差过大,使用数值优化(如fminsearch)修正点坐标,使其满足相切/相交条件。
    • 启用坐标归一化:将图像坐标缩放到[-1,1]范围(修改norm_matrix为对应的缩放平移矩阵),计算完成后反变换回原坐标,提升数值计算精度。
  • 确认椭圆平面的合理性:检查第二张图中前轮椭圆是否准确对应车辆的轮平面,若椭圆拟合错误(如拟合到了非轮平面的轮廓),调整C和H参数无法解决问题,需重新拟合椭圆。

内容的提问来源于stack exchange,提问作者Homeyra Mahmoudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:03:14