Mi colega y yo hemos estado tratando de implementar un algoritmo descrito en el documento "la Recuperación local de la forma de la superficie del espejo de la reflexión de una cuadrícula regular", autor principal de que Silvio Savarese. Creo que hemos recorrido un camino en nuestra comprensión de ella, pero me preguntaba si alguien ha intentado es de aplicación, o éxito, y estaría dispuesto a proporcionar alguna información?
Más específicamente, el algoritmo se supone que debe ser capaz de obtener la posición, normal, y la curvatura de una superficie reflectante en un punto utilizando sólo 2 líneas que se intersectan en ese punto, y sus vértices. Ya he implementado con éxito un algoritmo similar al que se describe en "3D Adquisición de creación de Reflejo de los Objetos" en c++ y Objective-C usando OpenCV, pero que, lamentablemente, requiere una inicial valor de profundidad (al menos no para nosotros, porque la solución que ellos proporcionan para la obtención de la inicial de la profundidad en la sección 5.4 parece que no funciona, probablemente porque tenemos mucho menor resolución, que no podemos usar color calibrado como una señal). Que, ya que el hecho de conocer a un punto inicial no es muy ideal en nuestra aplicación, estamos explorando Silvio del método como una alternativa posible.
Heres lo que hemos recogido de su método hasta ahora (teniendo en cuenta que todo lo que me interesa, por el momento, es el valor 's', y es normal correspondiente 'nr', que se puede obtener fácilmente una vez que se conoce):
Calibrate the camera and scene (already done and tested and used in our prior algorithm)
Obtain qDot for the 2 lines by Eq 32 and project them onto the camera sensor plane 'l'
units along the view direction 'v'
Obtain the corresponding deltaP's (basic math since the scene is already calibrated)
Calculate the tanPhi's by normalizing qDot and taking the tangent of the angle between
that and the image plane's x axis.
for(double s=startValue, s<=endValue; s+=stepSize)
{
Solve for the vector position 'r' on the mirror surface (Eq 1)
Solve for the matrix 'R' via solving for 'np' and 'nr' to obtain conversion between XYZ
and UVW space (Page 4of14, second paragraph)
Solve cosTheta (shown with Eq3) and sinTheta (obtained by equation for cosTheta
via trig rules)
Solve Bu and Bv (shown with Eq3)
Solve for matrix 'T' (Eq 12)
Solve for h1, h2, and h3 (described right below Eq 4 on page 6of14)
Solve for V (Described half way down on page 8of14)
Check to see if Eq 17 is true (or within some epsilon), if is, return s,
else continue.
}
Me doy cuenta de que no es el más eficaz solucionador numérico para s (en realidad estamos usando un poco mejor solución), pero entiende que esto es sólo un ejemplo y ya he gráficamente todos los valores elegidos para s (1en para 1000in con un 0.1 en el paso, 40 pulgadas o así, siendo el valor correcto) en varias regiones de nuestra parte y que sólo los enfoques de solución para Eq 17 una vez, y difiere de todos los demás. Así que algo está mal, porque en realidad nunca llega a una solución. Además, si ejecuta este algoritmo en todos los puntos de nuestra parte, de proyecto y de sus correspondientes valores (los que vinieron más cercano a la solución de E17) en 3 espacio, se ve como el ruido y no tiene ningún parecido con nuestra parte.
He intentado varios métodos diferentes para calcular tanPhi, y no estoy totalmente seguro de cuál es la manera correcta. El cálculo es en el espacio de imagen, o calcularlo por el ángulo entre rDot y la U del eje (obtenido por Eq11 y la cruz de np y nr)? El papel no parece totalmente claro en eso, o cómo hacerlo. En realidad no tenemos líneas de intersección, sólo puntos, por lo que yo sé tanPhi va a ser un poco solo porque es cambiante como deltaT varía (que nuestro deltaT es relativamente grande) pero no varían mucho, la superficie que estamos viendo es sólo acerca de 1200mm-1400mm de radio, y yo creo que si tuviéramos un poco apagado, la parte sería ruidoso, pero en general correcto... en cambio es totalmente apagado.
'l' todavía estoy un poco confundido, así como, en otro stackoverflow post 'Propiedades de la Cámara de 3d usando reflexión especular', 'l', se indicó que la longitud focal, pero hay un componente x y y a la longitud focal de una cámara oscura modelo intrínseca de la matriz... Podemos simplemente el promedio de los 2? Están bastante cerca en nuestro caso, pero lo que si que no tendría que ser suficiente?
Tampoco estoy totalmente seguro de lo que debe ser convertida en espacio UVW ("el principio del sistema de referencia"), y lo que no. Sé que a los estados en la página 4, justo antes de seg 2.1, que todos los cálculos de aquí en UVW (a menos que se indique lo contrario), pero hay algunas cosas que parecen tener más sentido para calcular en XYZ (como cosTheta y 'T') y él nunca se menciona que debe ser. En Silvios tesis de doctorado, por ejemplo, no dice que hasta después de la obtención de cosTheta. Así que estoy asumiendo que cosTeta puede ser obtenida en XYZ, ya que a sólo el coseno de un ángulo que puede ser obtenido en cualquier espacio? Pero no puede 'T' ser obtenidos en cualquier espacio, por la misma lógica, ya que es simplemente una matriz de rotación?
Y, con la conversión (XYZ UVW) realmente hace sentido para restar r en todos los casos? Sé que es un punto como 'p0' tiene sentido... tu solo centrado en r, pero para las direcciones en realidad hace ningún sentido (para calcular algo así como 'T')? Para que tendrías que convertir 'd' a UVW (si 'T' es, de hecho, se supone que debe ser calculado en UVW), pero la 'd' es una dirección... centrado en r no tiene sentido. No es muy explícito en que.
La última cosa que puedo pensar, y esto probablemente puede esperar hasta que la matemática está bien, pero ¿puede ser resuelto en una forma cerrada de la clase "s=f(medidos y los valores calibrados)"? Silvio elude el hecho de que rDot puede ser resuelto en forma cerrada, después de saber s, pero nunca realmente parece decir donde s puede ser o no. Me pregunto si esto va a para siempre requieren un solucionador numérico o no? La rápida escribió en c++ parece que funciona bien, y converge rápidamente, pero me gustaría, obviamente, ser agradable si este fue cerrado función plug and chug suerte de hablar!
Mi colega ha intentado contactar con Silvio, así como algunos de los co-autores, pero hasta el momento no hay suerte. Yo estaría muy agradecido si alguien pudiera proporcionar alguna información aquí! Sería agradable ver a un algoritmo como este y en los pueblos manos, tal vez incluso implementado en OpenCV un día! Sé que la obtención de la superficie de un reflector especular es todavía un problema abierto, pero sería agradable si este algoritmo, y otros como él, estaban disponibles para las pruebas!