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.

  • Modifica della port predefinita (vale a dire 5037) su cui viene eseguito il server adb
  • Salvataggio dell'ingresso audio del motore di riconoscimento vocale Android
  • L'applicazione che ha fornito "la conversione al formato Dalvik non è riuscito con l'errore 1" durante l'esecuzione
  • schemi di URL personalizzati iOS rispetto a Universal Links e controparti Android
  • Avere problemi di Android con vasi javax Sun
  • Modificare la barra di azione homeAsUpIndicator Programmaticamente
  • 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.

  • iOS e Android Algoritmo o libreria per i bordi delle piume delle immagini simili a photoshop
  • Modo giusto per formattare la data con stringhe come oggi, ieri, domani ecc
  • Utilizzo di SIFT per la realtà aumentata
  • Risultato dall'elaborazione del segnale audio con l'algorithm di Goertzel
  • AppCompat non support il tema corrente
  • Come rilevare le pressioni lunghe del tasto del volume in un servizio?
  • 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.