2012-07-12 10 views
9

Przetwarzam niektóre obrazy, które przechwytuje mój UGV (Unmanned Ground Vehichle), aby przenieść go na linię.Wykrywanie linii | Wykrywanie kątów za pomocą Java

Chcę uzyskać kąt tej linii w oparciu o horyzont. Postaram się wyjaśnić za pomocą kilku przykładów:

90 degrees image

obraz powyżej, aby mój UGV trzymać prosto, jak kąt wynosi około 90 stopni. Ale po stałaby się skręcić w lewo, a kąt compaired do horyzontu zaokrągla około 120.

120 degrees image

mógłbym z powodzeniem przekształcić te obrazy w obrazie poniżej używając Otsu dla Progowanie:

thresholded image

A także stosowany algorytm wykrywania krawędzi, aby uzyskać w ten sposób:

laplacian filter

Ale utknąłem teraz próbuje znaleźć algorytm, który detecs te linie i krawędzie/wyjścia - albo pomaga mi wyjście - kąt takiej linii ..

+1

Czy obejrzałeś ImageJ? – Ivan

+1

Spójrz na [transformatę Hough] (http://en.wikipedia.org/wiki/Hough_transform). – Maurits

Odpowiedz

6

Oto moja próba korzystania ImageJ:

// Open the Image 
ImagePlus image = new ImagePlus(filename); 

    // Make the Image 8 bit 
IJ.run(image, "8-bit", ""); 

    // Apply a Threshold (0 - 50) 
ByteProcessor tempBP = (ByteProcessor)image.getProcessor(); 
tempBP.setThreshold(0, 50, 0); 
IJ.run(image, "Convert to Mask", ""); 

    // Analyze the Particles 
ParticleAnalyzer pa = new ParticleAnalyzer(
    ParticleAnalyzer.SHOW_MASKS + 
    ParticleAnalyzer.IN_SITU_SHOW, 
    1023 + 
    ParticleAnalyzer.ELLIPSE 
    , rt, 0.0, 999999999, 0, 0.5); 

IJ.run(image, "Set Measurements...", "bounding fit redirect=None decimal=3"); 

pa.analyze(image); 

int k = 0; 
double maxSize = -1; 
for (int i = 0; i < rt.getCounter(); i ++) { 
    // Determine creteria for best oval. 
    // The major axis should be much longer than the minor axis. 
    // let k = best oval 
} 
double bx = rt.getValue("BX", k); 
double by = rt.getValue("BY", k); 
double width = rt.getValue("Width", k); 
double height = rt.getValue("Height", k); 

// Your angle: 
double angle = rt.getValue("Angle", k); 
double majorAxis = rt.getValue("Major", k); 
double minorAxis = rt.getValue("Minor", k); 

Jak działa kod:

  1. Zrób zdjęcie grayscaled.
  2. Zastosuj próg, aby uzyskać tylko ciemne obszary. Zakłada to, że linie zawsze będą bliskie czerni.
  3. Zastosuj analizator cząstek, aby znaleźć elipsy na obrazie.
  4. Zapętlić "Cząstki", aby znaleźć te, które spełniają nasze kryteria.
  5. Uzyskaj kąt z naszej Particle.

Oto przykład tego, co obraz wygląda, kiedy analizuje go:

Oval Image Oval Image 2

UWAGA: Kod jest niesprawdzone. Właśnie przekonwertowałem to, co zrobiłem w Visual ImageJ na Javę.

+0

AWESOOOMMEEE !!! Wielkie dzięki!!! Mam jednak kilka zapytań: 1) W jaki sposób wygenerowałeś taki kod z imageJ? 2) Będę działał na Androida, czy masz jakieś uwagi na ten temat? –

+0

Mam spore doświadczenie w tłumaczeniu tego, co robię wizualnie na Javę, często używam również opcji Mac-> Record. W przypadku Androida wystarczy upewnić się, że można korzystać z biblioteki ImageJ i upewnić się, że program ImageJ nie próbuje wyświetlić okna wizualnego. – Ivan

+0

@Ivan, czy możesz pomóc z tym problemem, który jest dość podobny? http://stackoverflow.com/questions/25360544/line-detection-in-java – Jjang