OpenCV distinguere i contorni di intersezione

Ho 2 contorni A e B e voglio controllare se si intersecano. Entrambi A e B sono vettori di tipo cv::Point e sono di diverse dimensioni

Per verificare intersezione, stavo tentando di fare un bitwise_and. Questo è il lancio di un’eccezione, perché gli ingressi sono di dimensioni diverse. Come faccio a risolvere questo problema ?

Edit:

L’immagine allegata dovrebbe dare una migliore idea circa il problema. L’auto è accompagnato da un contorno blu e l’ostacolo di una rosa di contorno. Ho bisogno di controllare per l’intersezione.
OpenCV distinguere i contorni di intersezione

InformationsquelleAutor Madman | 2011-12-18

 

3 Replies
  1. 12

    Una semplice, ma forse non la più efficiente (??) modo sarebbe quello di utilizzare drawContours per creare due immagini: una con il contorno della vettura e uno con il contorno dell’ostacolo.

    Poi and insieme, e che è ancora positivo, saranno punti di intersezione.

    Alcuni pseudocodice (io uso l’interfaccia Python quindi non sarebbe ottenere la sintassi C++ destra, ma dovrebbe essere abbastanza semplice per voi per convertire i):

    import numpy as np # just for matrix manipulation, C/C++ use cv::Mat
    # find contours.
    contours,h = findContours( img, mode=RETR_LIST, method=CHAIN_APPROX_SIMPLE )
    # Suppose this has the contours of just the car and the obstacle.
    
    # create an image filled with zeros, single-channel, same size as img.
    blank = np.zeros( img.shape[0:2] )
    
    # copy each of the contours (assuming there's just two) to its own image. 
    # Just fill with a '1'.
    img1 = drawContours( blank.copy(), contours, 0, 1 )
    img2 = drawContours( blank.copy(), contours, 1, 1 )
    
    # now AND the two together
    intersection = np.logical_and( img1, img2 )
    
    # OR we could just add img1 to img2 and pick all points that sum to 2 (1+1=2):
    intersection2 = (img1+img2)==2

    Se guardo intersection mi metterò un immagine che è 1 nel caso in cui i contorni si intersecano e 0 altrove.

    In alternativa, è possibile compilare il intero di contorno (e non solo da contorno, ma riempire l’interno con drawContours( blank.copy(), contours, 0, 1, thickness=-1 ) e poi il intersection immagine conterrà l’area di intersezione tra i contorni.

    • Grazie ! Sembra funzionare abbastanza bene.
    • Come possiamo visualizzare l’intersezione utilizzando imshow(), quando si utilizzano imshow per visualizzare l’intersezione, ottenendo un’immagine nera. Ma quando stampati all’incrocio, come descritto osservato uni e zeri. C’è qualche lavoro in giro per visualizzare l’intersezione
  2. 0

    Se si prima di ordinare i vettori, utilizzando praticamente qualsiasi coerente criterio di ordinamento che si può trovare con, quindi è possibile utilizzare std::set_intersection direttamente sui vettori. Questo può essere più veloce rispetto alla ha accettato di rispondere nel caso in cui i contorni sono pochi rispetto alla dimensione dell’immagine.

  3. 0

    Ho trovato il Clipper libreria molto utile per questi tipi di scopi. (È semplice trasformare i vettori di cv::Point di Clipper Path oggetti.)

Lascia un commento