2011-08-31 13 views
19

Sto cercando gli angoli su un'immagine, non ho bisogno dei contorni, solo dei 4 angoli. Cambierò la prospettiva usando 4 angoli.Come trovare gli angoli su un'immagine usando OpenCv

Sto usando Opencv, ma ho bisogno di conoscere i passaggi per trovare gli angoli e quale funzione userò.

mie immagini saranno in questo modo: (senza punti rossi, dipingerò i punti dopo) enter image description here

Modificato:

Dopo i passi suggeriti, ho writed il codice: (Nota: Io non usando puro OpenCv, sto usando javaCV, ma la logica è la stessa).

// Load two images and allocate other structures (I´m using other image) 
    IplImage colored = cvLoadImage(
      "res/scanteste.jpg", 
      CV_LOAD_IMAGE_UNCHANGED); 

enter image description here

IplImage gray = cvCreateImage(cvGetSize(colored), IPL_DEPTH_8U, 1); 
    IplImage smooth = cvCreateImage(cvGetSize(colored), IPL_DEPTH_8U, 1); 

    //Step 1 - Convert from RGB to grayscale (cvCvtColor) 
    cvCvtColor(colored, gray, CV_RGB2GRAY); 

enter image description here

//2 Smooth (cvSmooth) 
    cvSmooth(gray, smooth, CV_BLUR, 9, 9, 2, 2); 

enter image description here

//3 - cvThreshold - What values? 
    cvThreshold(gray,gray, 155, 255, CV_THRESH_BINARY); 

enter image description here

//4 - Detect edges (cvCanny) -What values? 
    int N = 7; 
    int aperature_size = N; 
    double lowThresh = 20; 
    double highThresh = 40;  
    cvCanny(gray, gray, lowThresh*N*N, highThresh*N*N, aperature_size); 

enter image description here

//5 - Find contours (cvFindContours) 
    int total = 0; 
    CvSeq contour2 = new CvSeq(null); 
    CvMemStorage storage2 = cvCreateMemStorage(0); 
    CvMemStorage storageHull = cvCreateMemStorage(0); 
    total = cvFindContours(gray, storage2, contour2, Loader.sizeof(CvContour.class), CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE); 
    if(total > 1){ 
      while (contour2 != null && !contour2.isNull()) { 
       if (contour2.elem_size() > 0) { 
       //6 - Approximate contours with linear features (cvApproxPoly) 
        CvSeq points = cvApproxPoly(contour2,Loader.sizeof(CvContour.class), storage2, CV_POLY_APPROX_DP,cvContourPerimeter(contour2)*0.005, 0); 
        cvDrawContours(gray, points,CvScalar.BLUE, CvScalar.BLUE, -1, 1, CV_AA); 

       } 
       contour2 = contour2.h_next(); 
      } 

    } 

enter image description here

Quindi, voglio trovare le cornes, ma Io non so come usare gli angoli funzionano come cvCornerHarris e altri.

+3

di OpenCV "corner" funzioni non trovano gli angoli nel modo in cui si sta pensando di - più o meno, trovano aree con variazioni orizzontali e verticali significative. L'obiettivo delle funzioni d'angolo in OpenCV è quello di trovare parti distintive dell'immagine che saranno utili per il tracciamento visivo, che non è necessariamente ciò che comunemente pensiamo come angoli. –

+0

Il codice esatto all'indirizzo http://stackoverflow.com/a/14368605/1832154 (eccetto la parte di ridimensionamento, poiché l'immagine è già sufficientemente piccola) fornisce http://i.imgur.com/hMdAlHX.png – mmgp

risposta

22

primo luogo, verificare /samples/c/squares.c nella vostra distribuzione OpenCV. Questo esempio fornisce un rivelatore quadrato e dovrebbe essere un buon inizio su come rilevare le caratteristiche ad angolo. Quindi, dai un'occhiata alle funzioni orientate alle funzioni di OpenCV come cvCornerHarris() e cvGoodFeaturesToTrack().

I metodi sopra riportati possono restituire molte funzioni ad angolo - la maggior parte non saranno gli "angoli veri" che stai cercando. Nella mia applicazione, ho dovuto rilevare i quadrati che erano stati ruotati o inclinati (a causa della prospettiva). La mia condotta di rilevamento costituito da:

  1. Converti da RGB a scala di grigi (cvCvtColor)
  2. Smooth (cvSmooth)
  3. Threshold (cvThreshold)
  4. Rileva bordi (cvCanny)
  5. Trova contorni (cvFindContours)
  6. Contorni approssimativi con caratteristiche lineari (cvApproxPoly)
  7. Trova "rettangoli" che erano strutture che: avevano contorni poligonali posseduti cantare 4 punti, erano di area sufficiente, i bordi adiacenti erano ~ 90 gradi, la distanza tra i vertici "opposti" era di dimensioni sufficienti, ecc.

Il passaggio 7 era necessario perché un'immagine leggermente rumorosa può produrre molte strutture che appaiono rettangolari dopo la poligonalizzazione. Nella mia applicazione, dovevo anche occuparmi di strutture quadrate che apparivano all'interno o sovrapposte al quadrato desiderato. Ho trovato che la proprietà dell'area del contorno e il centro di gravità sono utili per distinguere il rettangolo appropriato.

+0

Ho bisogno di un piccolo aiuto con il passaggio 7, come usare cvCornerHarris, con il mio esempio, vedere il post modificato, puoi aiutarmi? – Ricardo

+1

cvSmooth somiglia a una sfocatura gaussiana? Ti dilata il risultato di cvCanny? Come si approssimano i contorni con, diciamo 5 angoli (quadrato deformato a causa delle ombre ecc.) O suqares con una piccola cresta. Il tuo approccio è più o meno quello che voglio fare, ma mi sto battendo molto. Potete fornire alcuni esempi di codice? Sarebbe molto utile. – sschrass

7
+0

Come segue -up, e per un po 'di rehash nel blog di sudoku: cerca di trovare gli angoli per trovare i bordi. Inizia con la tua immagine con soglia, trova linee diritte prominenti (hough) e cerca dove si intersecano. Ecco dove sono i tuoi angoli. –

0

Applicare houghlines all'immagine canny - si otterrà un elenco di punti applicare convesso a questo insieme di punti

Problemi correlati