2011-12-29 34 views
8

Me explico mejor mi problema con una imagenDibujar línea perpendicular a una línea en OpenCV

Tengo un contorno y una líneaque está pasando a través de ese contorno.
En el intersección punto de contorno y línea Quiero dibujar una línea perpendicular en el punto de intersección de una línea y contornear hasta una distancia determinada.
Sé que punto de intersección así como cuesta de la línea.
Como referencia, adjunto esta imagen. enter image description here

+0

por favor, añadir más información sobre los datos que ya tiene. ¿Tienes la imagen ¿Tienes ab? un contorno? ¿Tienes el eje en sí? –

+0

He agregado ... Por favor, mira eso ... Especifica qué quieres más ... Por favor, ayúdame ... – Wazzzy

Respuesta

6

Si la línea azul en la imagen va desde el punto A al punto B, y que desea trazar la línea roja en el punto B, puede hacer lo siguiente:

  1. Obtener el vector de dirección que va de a a B. Esto sería: v.x = B.x - A.x; v.y = B.y - A.y;
  2. normalizar el vector: mag = sqrt (v.x*v.x + v.y*v.y); v.x = v.x/mag; v.y = v.y/mag;
  3. girar el vector 90 grados mediante el canje de x e y, y la inversión de uno de ellos. Nota sobre la dirección de rotación: en OpenCV y el procesamiento de imágenes, en general los ejes xey no están orientados de forma euclidiana, en particular, el eje y apunta hacia abajo y no hacia arriba. En euclidiano, invertir la x final (y inicial) rotaría en sentido antihorario (estándar para euclidiano), y la inversión de y giraría en el sentido de las agujas del reloj. En OpenCV es todo lo contrario. Así, por ejemplo, para obtener la rotación en sentido horario en OpenCV: temp = v.x; v.x = -v.y; v.y = temp;
  4. crear una nueva línea en B que apunta en la dirección de v: C.x = B.x + v.x * length; C.y = B.y + v.y * length; (Tenga en cuenta que usted puede hacer que se extienden en ambas direcciones mediante la creación de un punto D en la dirección opuesta . dirección simplemente la negación de longitud)
+0

Gracias por tu respuesta .... Déjame intentar ...... – Wazzzy

+0

Eso funcionó para mí ... Pero quiero saber un poco más echa un vistazo a la imagen editada .... – Wazzzy

+0

Cómo encontrar (Dx, Dy) – Wazzzy

1

Ésta es mi versión de la función:

def getPerpCoord(aX, aY, bX, bY, length): 
    vX = bX-aX 
    vY = bY-aY 
    #print(str(vX)+" "+str(vY)) 
    if(vX == 0 or vY == 0): 
     return 0, 0, 0, 0 
    mag = math.sqrt(vX*vX + vY*vY) 
    vX = vX/mag 
    vY = vY/mag 
    temp = vX 
    vX = 0-vY 
    vY = temp 
    cX = bX + vX * length 
    cY = bY + vY * length 
    dX = bX - vX * length 
    dY = bY - vY * length 
    return int(cX), int(cY), int(dX), int(dY) 
+0

Puede quitar el 'if (vX == 0 o vY == 0): return 0, 0, 0, 0', el código funciona bien en ese caso. De todos modos, ¡gracias por publicar esto! – krookedking

+0

Tuve un error y los corrijo con el "si ..." – CofeDrink68

Cuestiones relacionadas