Usando OpenCV Come rilevare una casella nell'immagine mentre eliminando gli oggetti stampati all'interno della scatola?

StackOverflow https://stackoverflow.com//questions/25082372

Domanda

Sto cercando di sviluppare l'applicazione di ordinamento della scatola in QT e usando OpenCV. Voglio misurare la larghezza e la lunghezza della scatola.

image image

Come mostrato nell'immagine sopra voglio rilevare solo linee più esterna (cioè bordi della scatola), che mi daranno larghezza e lunghezza della scatola, indipendentemente da qualsiasi tipo di stampa all'interno della scatola.

Cosa ho provato:

    .
  1. Prima ho provato a utilizzare Findcontours() e contorno selezionato con un'area massima, ma il contorno del bordo esterno non è racchiuso (rotto da qualche parte nell'output canny) molte volte e quindi non viene rilevato come un contorno.

    < / Li >.

  2. Hough Line Trans Trasforma mi dà troppe linee, non so come ottenere solo quattro righe sono interessate da questo.

  3. Ho provato il mio algoritmo come,

    Converti l'immagine in scala grigia.

    Prendi una colonna di immagine, confronta ogni pixel con il prossimo pixel successivo di quella colonna, se la differenza nel valore è maggiore di qualche soglia (diciamo 100) che il pixel appartiene al bordo, quindi conservare in array. Fai questo per tutte le colonne e darà la linea superiore della scatola parallela all'asse X.

    Seguire la stessa procedura, ma dall'ultima colonna e ultima riga (cioè dal basso verso l'alto), darà la linea inferiore parallela all'asse X.

    Allo stesso modo trovare linee paralleli anche all'asse y. Ora ho quattro matrici di punti, uno per ogni lato.

  4. Ora questo mi dà buoni risultati se la scatola è posta in modo tale che i suoi lati siano esattamente paralleli a asse x e y. Se la scatola è posizionata anche leggermente orientata in una certa direzione, mi dà linee diagonali che è ovvia come mostrato nell'immagine sotto.

    Uscita errata

    Come mostrato nell'immagine sottostante ho rimosso il primo 10 e gli ultimi 10 punti da tutti e quattro gli array di punti (che sono responsabili per disegnare linee diagonali) e disegnarono le linee, che non funzionerà quando la scatola è inclinata più e anche le misurazioni andrà male.

    Inserisci Descrizione dell'immagine qui

    Ora la mia domanda è,

    C'è un modo più semplice in OpenCV per ottenere solo bordi esterni (rettangolo) di scatola e arrivare lì Dimensioni, ignorando qualcosa stampato sulla scatola e orientato in qualsiasi direzione?

    Non sto necessariamente chiedendo di correggere / migliorare il mio algoritmo, ma qualsiasi suggerimento su questo è anche il benvenuto. Ci scusiamo per un post così grande.

Altri suggerimenti

Poiché la scatola è posta in uno sfondo a contrasto, dovresti essere in grado di utilizzare la soglia OTSU.

    .
  • Soglia l'immagine (usa il metodo OTSU)
  • Filtra tutti i pixel randagi che sono fuori dalla regione della scatola (speriamo di non avere molti pixel di questi pixel e può facilmente rimuoverli con un filtro mediano o morfologico)
  • Trova contorni
  • Combina tutti i punti di contorno e ottieni il loro scafo convesso (idea qui è trovare la regione convessa che limita tutti questi contorni nella regione della scatola indipendentemente dalla loro connettività)
  • Applicare un approssimazione del poligono (approssimatore) a questo scafo convesso e controllare se si ottiene un quadrilatero
  • Se non ci sono distorsioni prospettiche, dovresti ottenere un rettangolo, altrimenti dovrai correggerlo
  • Se ottieni un rettangolo, hai le sue dimensioni.Puoi anche trovare il rettangolo di area minima (minarerect) del convexhull, che dovrebbe darti direttamente un rotato
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top