评估拍照事物的最佳方法是哪一种?
我的应用程序应该使用欧元硬币作为参考来估计对象的长度(以毫米为单位)。 这是一个截图示例:
为了得到被拍摄的硬币的直径,我首先计算出通过这三个点的圆的方程
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毫米。 我想我应该运用一个修正因子或者考虑到其他因素使微积分复杂化,但是哪一个呢? 你能给我一些提示吗? 任何帮助对我都有用。
-
find硬币 (
green
包围盒矩形)无论是手动或通过search特定的颜色,图案,hough变换,分割…这将限制区域search下一步
-
find边界 (颜色强度中鲜明的
red
边)所以创build一个硬币边界点(小心阴影)只是扫描足够高的强度颠簸。
-
计算圆心
所有边界点的平均值
-
testing
min/max
距离的所有边界点到中心如果倾斜很小,那么你将有许多最小和最大半径的点,所以从他们中间。 如果
|max-min|
是非常小,那么你没有倾斜。 最小/最大距离点与中心之间的连线为您提供black
基准vector。 -
使用
black
基本向量来衡量所以select2点(
red
d)来测量和投射green
射线,它们平行于基向量。 他们的交集将创build2
行a,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标准