2013-04-08 10 views
6

Piszę aplikację za pomocą OpenCV 2.4.3.2 na Androida.
Moja aplikacja dotyczy rozpoznawania tablic rejestracyjnych.
istnieje kilka sposobów, aby to zrobić, postanowiłem wykonać następujące czynności:

1. Konwersja obrazu do przestrzeni barw HSV
2. Próg obraz według tablicy rejestracyjnej HSV (w moim kraju są żółte .. .)
3. wygładzić obraz Rozmycie gaussowskie
4. wykrywanie krawędzie
5. find kontury
6. houghlines funduszy
7. z houglines, wykryć krzywe, które pasują do prostokąta
siedzę na 7, nie mogę znaleźć sposobu, aby skutecznie wykryć prostokąty z ho ugliny.
Android OpenCV - wykryj krzywe z Houghlines

Byłbym bardzo wdzięczny za próbkę kodu w Javie, ponieważ większość przykładów jest w języku C/C++, a konwersja nie jest tak prosta.
tu jest mój kodu (teraz jestem po prostu rysowanie linii ...):

Imgproc.cvtColor(inputFrame, mRGBMat, Imgproc.COLOR_RGBA2BGR); 
// convert HSC color space 
Imgproc.cvtColor(mRGBMat, mHSVMat, Imgproc.COLOR_BGR2HSV); 
// Filter out colors which are out of range (license plate hue ~ 14) 
      Core.inRange(mHSVMat, new Scalar(9, 70, 80, 0), new Scalar(30, 255, 
        255, 0), mGrayMat); 
      // some smoothing of the image 
      for (int i = 0; i < 10; i++) { 
       Imgproc.GaussianBlur(mGrayMat, mGrayMat, new Size(9, 9), 2, 2); 
      } 
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, 
        new Size(3, 3), new Point(1, 1)); 
Imgproc.Canny(mGrayMat, mGrayMat0, 48, 120); 
Imgproc.dilate(mGrayMat0, mGrayMat0, kernel); 
kernel.release(); 
List<MatOfPoint> contours = new Vector<MatOfPoint>(); 
      Imgproc.findContours(mGrayMat0, contours, mHirerchy, 
        Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); 
      Mat lines = new Mat(); // finds houghlines in the contours 
      Imgproc.HoughLinesP(mGrayMat0, lines, 1, Math.PI/180, 1); 
      for (int x = 0; x < lines.cols(); x++) { 
       double[] vec = lines.get(0, x); 
       double x1 = vec[0], y1 = vec[1], x2 = vec[2], y2 = vec[3]; 
       Point start = new Point(x1, y1); 
       Point end = new Point(x2, y2); 
       Core.line(mRgba, start, end, RECT_COLOR, 1); 

      } 
+0

Może to pomóc: http://stackoverflow.com/questions/26583649/opencv-c-rectangle-detection-which-has-irregular-side –

Odpowiedz

0

Pisałem taki algorytm wcześniej. Klasyfikować linie na dwa rodzaje: 1) pionowe 2) poziome x) odstających do usunięcia

Następnie należy klasyfikować linie bardziej na dwa podtypy każda: 1a) pionowe, lewa granica 1b) pionowe, prawa granica 1x) wartości odbiegające do usunięcia 2a), 2b), 2x).

Uzyskaj średnie nachylenie i punkty przechwytujące tych linii, a masz swój "prostokąt".