2016-10-12 4 views
0

Mein Ziel ist es, das größte Rechteck in einem Bild zu erkennen, ob es verzerrt ist oder nicht. Nach etwas Recherche und Googeln kam ich auf einen Code, der theoretisch funktionieren sollte, aber in der Hälfte der Fälle sehe ich rätselhafte Ergebnisse.OpenCV erkennt größte Rechteck ergibt verwirrende Ergebnisse

I OpenCV für Android verwendet, hier ist der Code:

private void find_parallels() { 
    Utils.bitmapToMat(selectedPicture,img); 
    Mat temp = new Mat(); 
    Imgproc.resize(img,temp,new Size(640,480)); 
    img = temp.clone(); 

    Mat imgGray = new Mat(); 
    Imgproc.cvtColor(img,imgGray,Imgproc.COLOR_BGR2GRAY); 

    Imgproc.GaussianBlur(imgGray,imgGray,new Size(5,5),0); 

    Mat threshedImg = new Mat(); 
    Imgproc.adaptiveThreshold(imgGray,threshedImg,255,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,Imgproc.THRESH_BINARY,11,2); 

    List<MatOfPoint> contours = new ArrayList<>(); 
    Mat hierarchy = new Mat(); 
    Mat imageContours = imgGray.clone(); 
    Imgproc.cvtColor(imageContours,imageContours,Imgproc.COLOR_GRAY2BGR); 

    Imgproc.findContours(threshedImg,contours,hierarchy,Imgproc.RETR_TREE,Imgproc.CHAIN_APPROX_SIMPLE); 
    max_area = 0; 
    int num = 0; 

    for (int i = 0; i < contours.size(); i++) { 
     area = Imgproc.contourArea(contours.get(i)); 

     if (area > 100) { 
      MatOfPoint2f mop = new MatOfPoint2f(contours.get(i).toArray()); 
      peri = Imgproc.arcLength(mop, true); 
      Imgproc.approxPolyDP(mop, approx, 0.02 * peri, true); 

      if(area > max_area && approx.toArray().length == 4) { 
       biggest = approx; 
       num = i; 
       max_area = area; 
      } 

     } 

    } 

    selectedPicture = Bitmap.createBitmap(640,480, Bitmap.Config.ARGB_8888) ; 
    Imgproc.drawContours(img,contours,num,new Scalar(0,0,255)); 
    Utils.matToBitmap(img, selectedPicture); 

    imageView1.setImageBitmap(selectedPicture);} 

In einigen Fällen ist es ausgezeichnet funktioniert wie zwischen Monitor Lünette und Bildschirm .. sorry für die die weiße Linie in diesem Bild (Siehe zu sehen Farbe): Beispiel, das funktioniert: Example that works

jedoch, wenn sie in diesem Bild, und die meisten Bilder, wo der Bildschirm ist gräulich es gibt verrückt Ergebnis. Beispiel, das nicht funktioniert: Verwendung Morphologie Example that doesn't work

Antwort

1

Versuchen, sie weitet und dann erodieren mit gleichem Kernel sollte es besser. Oder benutze pyrDown + pyrUp, oder verwische es einfach.

Kurz gesagt Tiefpassfilter Klasse von Methoden, weil Ihr Objekt von Interesse ist viel größer als das Rauschen.

Verwandte Themen