¿Cuál es la mejor manera de estimar la medida de las cosas fotografiadas?

Se supone que mi aplicación estima la longitud (en milímetros) de un objeto utilizando monedas de euro como referencia. Este es un ejemplo de captura de pantalla:

Para obtener el diámetro de la moneda fotografiada, primero calculo la ecuación de un círculo que pasa por esos 3 puntos de la forma

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

y luego tengo el diámetro por

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

Finalmente puedo realizar la siguiente proporción para obtener la longitud del bolígrafo rojo:

/* 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

donde enChosenMeter.moneyDiameter se almacena el diámetro real de la moneda elegida como referencia (haciendo clic en uno de los 3 botones a continuación).

Necesito trabajar conDouble en lugar deCGFloat porqueesta El tutorial para resolver un sistema de ecuaciones lineales (para obtener la ecuación de círculo, coeficiente a, b, c) funciona con Double.

El problema es La longitud estimada del bolígrafo rojo siempre se sobreestima más de 10 mm. Supongo que debería aplicar un factor de corrección o complicar el cálculo teniendo en cuenta otros factores, pero ¿cuál? ¿Me puede dar algunas pistas? Cualquier ayuda me sería útil.

Respuestas a la pregunta(1)

Su respuesta a la pregunta