评估拍照事物的最佳方法是哪一种?

我的应用程序应该使用欧元硬币作为参考来估计对象的长度(以毫米为单位)。 这是一个截图示例:

在这里输入图像说明

为了得到被拍摄的硬币的直径,我首先计算出通过这三个点的圆的方程

x^2 + y^2 + ax + by + c = 0

然后我有直径

2 * square_root((a/2)^2 + (b/2)^2 -c)

最后我可以用下面的比例来得到红笔的长度:

 /* length_estimated_pen (mm) : distance_green_pins (points) = real_diameter_coin (mm) : diameter_on_screen (points) */ let distanceGreen:Double = Double(sqrt(pow(self.greenLocationA.center.x - self.greenLocationB.center.x, 2.0) + pow(self.greenLocationA.center.y - self.greenLocationB.center.y, 2.0))) let estimatedMeasure:Double = (distanceGreen * Double(ChosenMeter.moneyDiameter)) / diameter 

ChosenMeter.moneyDiameter中存储所选硬币的实际直径作为参考(通过点击下面的3个button之一)。

我需要使用Double而不是CGFloat因为本教程解决一个线性方程组(获得a,b,c系数的圆方程)与Double一起工作。

问题是红笔的估计长度总是被高估超过10毫米。 我想我应该运用一个修正因子或者考虑到其他因素使微积分复杂化,但是哪一个呢? 你能给我一些提示吗? 任何帮助对我都有用。

  1. find硬币green包围盒矩形)

    无论是手动或通过search特定的颜色,图案,hough变换,分割…这将限制区域search下一步

  2. find边界 (颜色强度中鲜明的red边)

    所以创build一个硬币边界点(小心阴影)只是扫描足够高的强度颠簸。

  3. 计算圆心

    所有边界点的平均值

  4. testingmin/max距离的所有边界点到中心

    如果倾斜很小,那么你将有许多最小和最大半径的点,所以从他们中间。 如果|max-min| 是非常小,那么你没有倾斜。 最小/最大距离点与中心之间的连线为您提供black基准vector。

  5. 使用black基本向量来衡量

    所以select2点( red d)来测量和投射green射线,它们平行于基向量。 他们的交集将创build2a,b 。 从这很容易:

    • d = sqrt((a*a)+(b*b))

    其中a,b是以单位表示的线的大小。 你可以像这样获得它:

    • a_size_unit = a_size_pixel * coin_r_unit / rmax_pixel
    • b_size_unit = b_size_pixel * coin_r_unit / rmin_pixel

硬币

[注意]

这幅图像被select来强调歪斜,但是您应该使用几乎平行的平面图像来切割表面以避免透视失真。 这个图像不是一个很好的例子,立方体离摄像机更远,然后硬币…

为了说明这一点,请参阅不同预测的select标准