使用 OpenCV 查找杯子上的点高

Finding point height on a cup using OpenCV

假设我想通过旋转找到一个杯子的 3D 位置,图像输入是这样的(这个杯子可以旋转指向任何方向):

假设我有一堆 2D 点指定顶部圆和底部圆,如下图所示。 (假设这些点是由一个人在杯子周围画线给出的,所以它不会很准确。可能需要椭圆拟合或 SolvePnP 才能恢复良好的近似值。底部的圆不是完整的圆,它只是圆的一部分。有时顶部也会被遮挡,所以我们不能相信会有一个完整的圆)

我也知道顶圈和底圈的物理半径,以及它们之间的距离,事先用尺子测量过。

我想找到完整的 2 个圆,如下图所示(我想我需要先找到杯子的位置及其向上的方向,然后才能投影出完整的圆):

假设我的最终目标是能够找到最近的 2D 顶点和最近的 2D 底点,给定杯子侧面的 2D 点,如下图所示:

一个点也可以在杯子里面,像这样:

让我们将 distance(a, b) 定义为以像素为单位计算点 a 和点 b 的欧式距离的函数。

据此我可以计算出 distance(side point, bottom point) / distance(top point, bottom point) 这将是一个从 0 到 1 的比例数字,如果我将这个数字乘以尺子测量的杯子的物理高度,那么我将以公制单位知道该点距离杯底有多高。

有什么方法可以找到边上给定的点对应的顶点和底点,从而最终求出该点离杯底的高度?

我正在考虑使用 PnP 来解决这个问题,但我的点没有与之关联的正确 ID。我不想知道杯子的确切旋转方向,我只想知道杯子的向上方向。 我还认为拟合椭圆可能会有所帮助,但可能不是最好的,因为圆并不完整。 如果您有什么建议,请告诉我如何从杯子底部获得点高度

鉴于精度问题,我认为不值得对锥体进行 3D 重建。

我会在顶部轮廓上执行一个 "standard" 椭圆拟合,这是最准确的,然后在底部执行一个约束椭圆拟合,知道垂直轴的位置。坐标约化后,最下面的椭圆可以写成

x²/a² + (y - h)²/b² = 1

可以用最小二乘法求解

请注意,要求用户指向底部直边的端点以及最低点而不是整条曲线可能更有利。

求解最近的顶部和底部点是一个纯二维问题(通过给定点和边的交点画线,并找到与椭圆的交点。