c++ - sistemas - que es un deadlock en informatica
¿Cómo juzgas la distancia(mundo real) de un objeto en una imagen? (3)
Estoy creando un programa de reconocimiento en C ++ y para hacerlo más robusto, necesito poder encontrar la distancia de un objeto en una imagen.
Digamos que tengo una imagen que se tomó a 22.3 pulgadas de una imagen de 8.5 x 11. El sistema identifica correctamente esa imagen en un cuadro con las dimensiones 319 píxeles por 409 píxeles.
¿Cuál es una forma efectiva de relacionar la Altura y el ancho reales (AH y AW) y la Altura y el ancho de píxeles (PH y PW) con la distancia (D)?
Supongo que cuando voy a usar la ecuación, PH y PW serán inversamente proporcionales a D y AH y AW son constantes (ya que el objeto reconocido siempre será un objeto donde el usuario puede indicar el ancho y la altura).
Puede que esta no sea una respuesta completa, pero puede llevarlo en la dirección correcta. ¿Alguna vez has visto cómo la NASA lo hace en esas fotos desde el espacio? La forma en que tienen esas pequeñas cruces en todas las imágenes. Así es como se les ocurre una idea justa sobre el tamaño y el tamaño del objeto, que yo sepa. La solución podría ser tener un objeto del que conoces el tamaño y el tamaño correctos en la imagen y luego calcular el relativo de los otros. Es hora de que hagas un poco de investigación. Si esa es la forma en que la NASA lo hace, entonces debería valer la pena echarle un vistazo.
Tengo que decir que esta es una de las preguntas más interesantes que he visto durante mucho tiempo en : D. Acabo de notar que solo tiene dos etiquetas adjuntas a esta pregunta. Agregar algo más en relación con las imágenes podría ayudarlo mejor.
Si conoce el tamaño del objeto del mundo real y el ángulo de visión de la cámara, asumiendo que conoce el ángulo de visión horizontal alfa (*), la resolución horizontal de la imagen es xres, entonces la distancia dw a un objeto en la mitad de la imagen que tiene píxeles xp de ancho en la imagen, y xw metros de ancho en el mundo real se puede derivar de la siguiente manera (¿cómo es su trigonometry ?):
# Distance in "pixel space" relates to dinstance in the real word
# (we take half of xres, xw and xp because we use the half angle of view):
(xp/2)/dp = (xw/2)/dw
dw = ((xw/2)/(xp/2))*dp = (xw/xp)*dp (1)
# we know xp and xw, we''re looking for dw, so we need to calculate dp:
# we can do this because we know xres and alpha
# (remember, tangent = oposite/adjacent):
tan(alpha) = (xres/2)/dp
dp = (xres/2)/tan(alpha) (2)
# combine (1) and (2):
dw = ((xw/xp)*(xres/2))/tan(alpha)
# pretty print:
dw = (xw*xres)/(xp*2*tan(alpha))
(*) alfa = El ángulo entre el eje de la cámara y una línea que atraviesa el punto situado más a la izquierda en la fila central de la imagen que está visible.
Enlace a sus variables: dw = D, xw = AW, xp = PW
No sé si cambió su pregunta en algún momento, pero mi primera respuesta es bastante complicada para lo que quiere. Probablemente puedas hacer algo más simple.
1) Solución larga y complicada (problemas más generales)
Primero necesitas saber el tamaño del objeto.
Puedes mirar los algoritmos de visión de computadora. Si conoces el objeto (sus dimensiones y forma). Su problema principal es el problema de la estimación de la postura (es decir, encontrar la posición del objeto en relación con la cámara). A partir de esto, puede encontrar la distancia. Puede consultar [1] [2] (por ejemplo, puede encontrar otros artículos en él si está interesado) o buscar POSIT, SoftPOSIT. Puede formular el problema como un problema de optimización: encuentre la pose para minimizar la "diferencia" entre la imagen real y la imagen esperada (la proyección del objeto dada la postura estimada). Esta diferencia suele ser la suma de las distancias (cuadradas) entre cada punto de imagen Ni y la proyección P (Mi) del objeto correspondiente (3D) punto Mi para los parámetros actuales.
De esto se puede extraer la distancia.
Para esto necesita calibrar su cámara (aproximadamente, encontrar la relación entre la posición del píxel y el ángulo de visión).
Ahora puede que no quiera codificar todo esto por usted mismo, puede usar las bibliotecas de visión de computadora como OpenCV, Gandalf [3] ...
Ahora es posible que desee hacer algo más simple (y aproximado). Si puede encontrar la distancia de la imagen entre dos puntos en la misma "profundidad" (Z) de la cámara, puede relacionar la distancia de la imagen d con la distancia real D con: d = a D / Z (donde a es un parámetro de la cámara relacionada con la distancia focal, la cantidad de píxeles que puede encontrar usando la calibración de la cámara)
2) Solución corta (para usted problema simple)
Pero aquí está la respuesta (simple, corta): si te imaginas en un plano paralelo al "plano de la cámara" (es decir, está perfectamente orientado hacia la cámara) puedes usar:
PH = a AH / Z
PW = a AW / Z
donde Z es la profundidad del plano de la imagen y a en un parámetro intrínseco de la cámara.
Para referencia, el modelo de cámara con orificios relaciona la imagen coordinada m = (u, v) con la coordinación mundial M = (X, Y, Z) con:
m ~ K M
[u] [ au as u0 ] [X]
[v] ~ [ av v0 ] [Y]
[1] [ 1 ] [Z]
[u] = [ au as ] X/Z + u0
[v] [ av ] Y/Z + v0
donde "~" significa "proporcional a" y K es la matriz de parámetros intrínsecos de la cámara. Necesitas hacer la calibración de la cámara para encontrar los K parámetros. Aquí asumí que au = av = a y como = 0.
Puede recuperar el parámetro Z de cualquiera de esas ecuaciones (o tomar el promedio de ambas). Tenga en cuenta que el parámetro Z no es la distancia desde el objeto (que varía según los diferentes puntos del objeto) sino la profundidad del objeto (la distancia entre el plano de la cámara y el plano del objeto). Pero supongo que eso es lo que quieres de todos modos.
[1] Determinación de pose de cámara de punto N lineal, Long Quan y Zhongdan Lan
[2] Un algoritmo lineal completo de 4 puntos para la determinación de pose de cámara, Lihong Zhi y Jianliang Tang