Come trovare gli angoli di un object Rect in openCV?

Sto utilizzando la libreria openCV sulla piattaforma android. Ho rilevato con successo il rettangolo più grande dell'image, ma poiché la mia applicazione verrà utilizzata per lo scopo di scansione, vorrei avere anche la funzionalità di modifica delle prospettive.

So come applicare la prospettiva Trasform e warpPerspectiveTransform, ma per questo avrò bisogno di angoli del rettangolo per i punti di origine.

  • org.json.JSONException: Valore <? xml del tipo java.lang.String non può essere convertito in JSONObject
  • Come hide la barra del titolo attraverso il codice in android
  • Android Studio - UNEXPECTED TOP-LEVEL EXCEPTION:
  • Come informare gli utenti di un aggiornamento di Android App?
  • Autorizzazione di controllo Android per LocationManager
  • Come importre RecyclerView per l'anteprima di Android L
  • Sembra molto facile trovare gli angoli dato che abbiamo le coordinate del primo angolo (in alto a sinistra) e la width / altezza associate all'object Rect, ma il problema è, per un rettangolo ruotato (il bordo di rotazione normale, ma i lati non paralleli a in questi casi, questi valori sono molto diversi. In questo caso memorizza i valori corrispondenti ad un altro rettangolo avente fianchi paralleli all'asse e che copre il rettangolo ruotato in modo che non mi sia in grado di rilevare gli angoli del rettangolo reale.

    Inoltre voglio fare un confronto tra questi due algoritmi per rilevare un foglio dall'image.

    1. Canny edge -> Contorno più grande -> rettangolo più grande -> trova angoli -> cambiamento di prospettiva

    2. Canny edge-> Linee Hough -> intersezione delle linee -> cambiamento di prospettiva

    La cosa che voglio chiedere è data se abbiamo un object Rect, come get tutti gli angoli di quel rettangolo?

    Grazie in anticipo.

  • Il volume è sempre lo stesso?
  • iOS e Android Algoritmo o libreria per i bordi delle piume delle immagini simili a photoshop
  • Triangolazione di posizione Wifi
  • Orientamento di bussola di Android su inattendibile (filter passa basso)
  • Come get la rotazione tra l'asse accelerometro e il vector di movimento?
  • Android Mapview: unione di marcatori sovrapposti in un nuovo marcatore
  • 2 Solutions collect form web for “Come trovare gli angoli di un object Rect in openCV?”

    Sono molto emozionante rispondere alla mia domanda! E 'stato facile, ma succede quando u appena cominciare con qualcosa con una documentazione non così appropriata.

    Stavo cercando di get gli angoli di un rettangolo generale che non era definito nell'implementazione di openCV e quindi era quasi imansible.

    Ho seguito il codice standard sullo stackoverflow per il rilevamento quadrato più grande. e gli angoli possono essere facilmente individuati usando il caCurve stesso.

    // convertire l'image in bianco e nero Imgproc.cvtColor (imgSource, imgSource, Imgproc.COLOR_BGR2GRAY);

    //convert the image to black and white does (8 bit) Imgproc.Canny(imgSource, imgSource, 50, 50); //apply gaussian blur to smoothen lines of dots Imgproc.GaussianBlur(imgSource, imgSource, new org.opencv.core.Size(5, 5), 5); //find the contours List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Imgproc.findContours(imgSource, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); double maxArea = -1; int maxAreaIdx = -1; Log.d("size",Integer.toString(contours.size())); MatOfPoint temp_contour = contours.get(0); //the largest is at the index 0 for starting point MatOfPoint2f approxCurve = new MatOfPoint2f(); MatOfPoint largest_contour = contours.get(0); //largest_contour.ge List<MatOfPoint> largest_contours = new ArrayList<MatOfPoint>(); //Imgproc.drawContours(imgSource,contours, -1, new Scalar(0, 255, 0), 1); for (int idx = 0; idx < contours.size(); idx++) { temp_contour = contours.get(idx); double contourarea = Imgproc.contourArea(temp_contour); //compare this contour to the previous largest contour found if (contourarea > maxArea) { //check if this contour is a square MatOfPoint2f new_mat = new MatOfPoint2f( temp_contour.toArray() ); int contourSize = (int)temp_contour.total(); MatOfPoint2f approxCurve_temp = new MatOfPoint2f(); Imgproc.approxPolyDP(new_mat, approxCurve_temp, contourSize*0.05, true); if (approxCurve_temp.total() == 4) { maxArea = contourarea; maxAreaIdx = idx; approxCurve=approxCurve_temp; largest_contour = temp_contour; } } } Imgproc.cvtColor(imgSource, imgSource, Imgproc.COLOR_BayerBG2RGB); sourceImage =Highgui.imread(Environment.getExternalStorageDirectory(). getAbsolutePath() +"/scan/p/1.jpg"); double[] temp_double; temp_double = approxCurve.get(0,0); Point p1 = new Point(temp_double[0], temp_double[1]); //Core.circle(imgSource,p1,55,new Scalar(0,0,255)); //Imgproc.warpAffine(sourceImage, dummy, rotImage,sourceImage.size()); temp_double = approxCurve.get(1,0); Point p2 = new Point(temp_double[0], temp_double[1]); // Core.circle(imgSource,p2,150,new Scalar(255,255,255)); temp_double = approxCurve.get(2,0); Point p3 = new Point(temp_double[0], temp_double[1]); //Core.circle(imgSource,p3,200,new Scalar(255,0,0)); temp_double = approxCurve.get(3,0); Point p4 = new Point(temp_double[0], temp_double[1]); // Core.circle(imgSource,p4,100,new Scalar(0,0,255)); List<Point> source = new ArrayList<Point>(); source.add(p1); source.add(p2); source.add(p3); source.add(p4); Mat startM = Converters.vector_Point2f_to_Mat(source); Mat result=warp(sourceImage,startM); return result; 

    e la function utilizzata per la trasformazione prospettica è riportta di seguito:

      public Mat warp(Mat inputMat,Mat startM) { int resultWidth = 1000; int resultHeight = 1000; Mat outputMat = new Mat(resultWidth, resultHeight, CvType.CV_8UC4); Point ocvPOut1 = new Point(0, 0); Point ocvPOut2 = new Point(0, resultHeight); Point ocvPOut3 = new Point(resultWidth, resultHeight); Point ocvPOut4 = new Point(resultWidth, 0); List<Point> dest = new ArrayList<Point>(); dest.add(ocvPOut1); dest.add(ocvPOut2); dest.add(ocvPOut3); dest.add(ocvPOut4); Mat endM = Converters.vector_Point2f_to_Mat(dest); Mat perspectiveTransform = Imgproc.getPerspectiveTransform(startM, endM); Imgproc.warpPerspective(inputMat, outputMat, perspectiveTransform, new Size(resultWidth, resultHeight), Imgproc.INTER_CUBIC); return outputMat; } 
     1. find the coordinate of left ,right, top,bottom point of the rect 2. min_x = min(left.x right.x,top.x,bottom.x) min_y = min(left.y right.y,top.y,bottom.y) max_x = max(left.x right.x,top.x,bottom.x) max_y = max(left.y right.y,top.y,bottom.y) 3. the corners's coordinate is the point with the min_x, min_y ,max_x, max_y 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.