2013-01-11 14 views
7

Ho bisogno di risolvere un problema quando sto rilevando rettangoli con angoli arrotondati usando opencv. Fondamentalmente sto usando lo stesso squares.c codice di esempio:Rileva punto d'angolo da rettangolo con angoli arrotondati

cvFindContours(gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); 
while(contours) 
{ 
    double area=fabs(cvContourArea(contours, CV_WHOLE_SEQ)); 
    if(area < minimum_area || area > maximum_area) { 
     contours = contours->h_next; 
     continue; 
    }    
    result = cvApproxPoly(contours, sizeof(CvContour), storage, 
     CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.05, 0); 
    if(result->total == 4 && 
     fabs(cvContourArea(result,CV_WHOLE_SEQ)) > 1000 && 
     cvCheckContourConvexity(result)) 
     { 

Con questo codice solito riesco a rilevare l'immagine, ma ho bisogno di regolare la prospettiva dell'immagine e per questo ho bisogno di rilevare i angoli dell'immagine , come fare questo e l'immagine ha gli angoli arrotondati? Il problema si verifica perché il punto che non ho bisogno di rilevare tra i punti, ad esempio, ho creato l'immagine seguente, dove le linee nere rappresentano i punti rilevati dal codice esistente e quelli blu che ho bisogno?

enter image description here

Grazie di per qualsiasi aiuto.

+0

Con "Ho bisogno di risolvere un problema" intendi "Voglio una funzione OpenCV pronta che risolva il mio problema"? Il tuo problema è risolto da semplici ordinamenti intelligenti dei punti neri. Da lì costruisci i quattro angoli blu. – mmgp

+0

@mmgp che ordina punti neri? Ma i punti neri non contengono punti blu! – Ricardo

+0

Ho trovato la soluzione qui: http://stackoverflow.com/questions/22519545/automatic-perspective-correction-opencv – delkant

risposta

0

Provare a ridimensionare l'immagine ad una dimensione più piccola con il comando cvResize e applicarvi il codice. La riduzione teorica delle dimensioni dell'immagine dovrebbe rendere più nitidi gli angoli dell'immagine e ridurre il problema a scapito della perdita di precisione.

+0

Una nota, funziona abbastanza bene, ma è necessario assicurarsi di utilizzare un'impostazione di interpolazione decente quando si ridimensiona tale come 'cubico' non' vicino più vicino'. –

2

In termini OpenCV, per prima cosa individuare il rettangolo nero utilizzando FindContours con RETR_EXTERNAL e CHAIN_APPROX_SIMPLE. Ora trovi il riquadro di limitazione minimo di questo rettangolo rotondo usando minAreaRect sui punti trovati da FindContours. Per ottenere gli angoli di questo rettangolo di selezione, utilizzare la funzione BoxPoints sul ritorno (centro, (larghezza, altezza), angolo di rotazione) di minAreaRect. Ora hai i quattro angoli della linea rossa che cerchi.

+0

minAreaRect restituirà effettivamente un rettangolo e non un quadrilatero come nell'esempio di risultato desiderato della linea rossa. – Wicpar

0

Ho avuto il problema e nessuna delle altre risposte ha aiutato. Nel mio caso ho dovuto correggere in prospettiva i datamatrices, che hanno un angolo mancante in alto a destra, che sembra arrotondato su un rilevamento harris.

Per risolvere questo problema, rilevare la forma come più vi piace, quindi ottenere lo scafo convesso del contorno. Una volta ottenuto, dovrai estrarre le 4 linee più lunghe (nessuna funzione opencv esiste, devi fare la tua funzione di estrazione) Quindi ottieni semplicemente le intersezioni delle 4 linee (anche la tua funzione) e riconvertilo a una matrice per la correzione prospettica.

Se il supporto può essere piegato o il rilevamento può presentare imperfezioni, è possibile che si desideri eliminare anche punti dal contorno con angoli elevati rispetto ai punti adiacenti, che possono creare deviazioni nei punti finali.