两椭圆切点不重合问题: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)对应上切点)会导致匹配错误。需添加逻辑验证每个解直线的类型:- 对每条直线L,判断是公切线还是交线:公切线满足与椭圆相切(即对于椭圆矩阵E,直线L满足
rank([E, L; L', 0])=3),交线则与椭圆有两个交点。 - 对切点,计算其在椭圆上的位置并按空间位置(如上下、左右)重新分类,而非依赖固定索引。
- 对每条直线L,判断是公切线还是交线:公切线满足与椭圆相切(即对于椭圆矩阵E,直线L满足
- 提升数值计算稳定性:
- 避免直接多次求逆(如
inv(inv(H1).'*C1*inv(H1))),可简化为(H1')\C1\H1减少数值误差。 - 对计算得到的点代入椭圆方程验证,若误差过大,使用数值优化(如
fminsearch)修正点坐标,使其满足相切/相交条件。 - 启用坐标归一化:将图像坐标缩放到[-1,1]范围(修改
norm_matrix为对应的缩放平移矩阵),计算完成后反变换回原坐标,提升数值计算精度。
- 避免直接多次求逆(如
- 确认椭圆平面的合理性:检查第二张图中前轮椭圆是否准确对应车辆的轮平面,若椭圆拟合错误(如拟合到了非轮平面的轮廓),调整C和H参数无法解决问题,需重新拟合椭圆。
内容的提问来源于stack exchange,提问作者Homeyra Mahmoudi
相关产品推荐
相关产品推荐

