Advertisement
neo7bf

opencv contours

Apr 16th, 2022
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.41 KB | None | 0 0
  1. package it.neo7bf;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.opencv.core.Core;
  7. import org.opencv.core.Mat;
  8. import org.opencv.core.MatOfPoint;
  9. import org.opencv.core.MatOfPoint2f;
  10. import org.opencv.core.Point;
  11. import org.opencv.core.Rect;
  12. import org.opencv.core.RotatedRect;
  13. import org.opencv.core.Scalar;
  14. import org.opencv.core.Size;
  15. import org.opencv.imgcodecs.Imgcodecs;
  16. import org.opencv.imgproc.Imgproc;
  17.  
  18. import nu.pattern.OpenCV;
  19.  
  20. public class SeparationTest3 {
  21.    
  22.     static {
  23.           OpenCV.loadShared();
  24.           //System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME); Serve ? Tutte e due le istruzioni caricano le librerie native. La seconda da per scontatto che siano state giĆ  installate.
  25.           //La prima le deposita in una cartella temporanea e poi le carica.
  26.     }
  27.    
  28.     static class I {
  29.         public String name;
  30.         public int v;
  31.         I(String name, int v) {
  32.             this.name = name;
  33.             this.v = v;
  34.         }
  35.     }
  36.    
  37.     public static void cannyTest() {
  38.  
  39.         List<I> images = List.of(
  40.             new I("2022-04-16_085329",3)
  41.         );
  42.  
  43.         for(I image : images) {
  44.  
  45.             Mat srcMat = Imgcodecs.imread("C:\\ProgettoScontrino\\scontrini\\campioni-test\\test-separazione\\"+image.name+".jpg");
  46.            
  47.             Mat grayMat = new Mat();
  48.             Mat blurredMat = new Mat();
  49.             Mat dilatedMat = new Mat();
  50.             Mat cannyMat = new Mat();
  51.            
  52.  
  53.             Imgproc.resize(srcMat, srcMat, new Size(0,0), 0.5, 0.5, Imgproc.INTER_AREA);
  54.             Imgproc.cvtColor(srcMat, grayMat, Imgproc.COLOR_BGR2GRAY);
  55.             Imgproc.threshold(grayMat, grayMat, 177, 200, Imgproc.THRESH_BINARY);
  56.             Imgproc.GaussianBlur(grayMat, blurredMat, new Size(21,21),0, 0,Core.BORDER_DEFAULT); //3,3, 9,9 15,15,....
  57.                
  58.             Mat rectKernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(21,21));
  59.            
  60.             Imgproc.dilate(blurredMat, dilatedMat, rectKernel, new Point(0,0),1);
  61.             Imgproc.Canny(dilatedMat,cannyMat,100,200,3);
  62.            
  63.             List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
  64.             final Mat hierarchy = new Mat();
  65.    
  66.             Imgproc.findContours(cannyMat, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
  67.            
  68.             contours = getMaxContours(contours,image.v);
  69.            
  70.             for(MatOfPoint cnt : contours) {
  71.                     MatOfPoint2f mop2f = new MatOfPoint2f(cnt.toArray());
  72.                     Imgproc.approxPolyDP(mop2f, mop2f, 0.02*Imgproc.arcLength(mop2f, true), true);
  73.                     RotatedRect rr = Imgproc.minAreaRect(mop2f);
  74.                     MatOfPoint m = new MatOfPoint();                   
  75.                     Imgproc.boxPoints(rr, m);
  76.                     Point[] rectPoints = new Point[4];         
  77.                     rr.points(rectPoints);
  78.                     for (int j = 0; j < 4; ++j) {
  79.                       Imgproc.line(srcMat, rectPoints[j], rectPoints[(j + 1) % 4], new Scalar(0,255,0), 20);
  80.                     }
  81.  
  82.                     //BoundingBox
  83.                     Rect boundingRect = Imgproc.boundingRect(cnt);
  84.                     Imgproc.rectangle(srcMat, boundingRect, new Scalar(0,0,255),20); //scalar not is RGB but BGR !                 
  85.             }
  86.                    
  87.             //C:\ProgettoScontrino\scontrini\campioni-test\test-separazione\output\
  88.             Imgcodecs.imwrite("C:\\ProgettoScontrino\\scontrini\\campioni-test\\test-separazione\\output\\"+image.name+"gray.jpg", grayMat);
  89.             Imgcodecs.imwrite("C:\\ProgettoScontrino\\scontrini\\campioni-test\\test-separazione\\output\\"+image.name+"blurred.jpg", blurredMat);
  90.             Imgcodecs.imwrite("C:\\ProgettoScontrino\\scontrini\\campioni-test\\test-separazione\\output\\"+image.name+"dilated.jpg", dilatedMat);
  91.             Imgcodecs.imwrite("C:\\ProgettoScontrino\\scontrini\\campioni-test\\test-separazione\\output\\"+image.name+"canny.jpg", cannyMat);
  92.             Imgcodecs.imwrite("C:\\ProgettoScontrino\\scontrini\\campioni-test\\test-separazione\\output\\"+image.name+"contours.jpg", srcMat);
  93.         }
  94.     }
  95.    
  96.     private static List<MatOfPoint> getMaxContours(List<MatOfPoint> contours,int maxStackSize) {
  97.         List<MatOfPoint> queue = new ArrayList<MatOfPoint>();
  98.         for(MatOfPoint currCnt : contours) {       
  99.             if(queue.isEmpty())
  100.                 queue.add(currCnt);
  101.             else {
  102.                 Rect boundingCurrRect = Imgproc.boundingRect(currCnt);             
  103.                 for(int i=0; i<queue.size(); i++) {
  104.                     Rect boundingRect = Imgproc.boundingRect(queue.get(i));                
  105.                     System.out.println("current area: "+ boundingCurrRect.area());
  106.                     System.out.println("area-"+i+": "+ boundingRect.area());
  107.                     if(boundingCurrRect.area() > boundingRect.area()) {
  108.                         queue.add(i,currCnt);
  109.                         if(queue.size() > maxStackSize)
  110.                             queue.remove(queue.size()-1);
  111.                         break;
  112.                     }
  113.                 }
  114.             }
  115.         }
  116.         return queue;
  117.     }
  118.  
  119.     public static void main(String[] args) {
  120.         cannyTest();
  121.     }
  122. }
  123.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement