Advertisement
Guest User

ColorBlobDetector

a guest
Nov 13th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.28 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using OpenCVForUnity.CoreModule;
  5. using OpenCVForUnity.ImgprocModule;
  6.  
  7. namespace OpenCVForUnityExample
  8. {
  9.     public class ColorBlobDetector
  10.     {
  11.         // Lower and Upper bounds for range checking in HSV color space
  12.         private Scalar mLowerBound = new Scalar (0);
  13.         private Scalar mUpperBound = new Scalar (0);
  14.         // Minimum contour area in percent for contours filtering
  15.         private static double mMinContourArea = 0.1;
  16.         // Color radius for range checking in HSV color space
  17.         private Scalar mColorRadius = new Scalar (25, 50, 50, 0);
  18.         private Mat mSpectrum = new Mat ();
  19.         private List<MatOfPoint> mContours = new List<MatOfPoint> ();
  20.    
  21.         // Cache
  22.         private Mat mPyrDownMat = new Mat ();
  23.         private Mat mHsvMat = new Mat ();
  24.         private Mat mMask = new Mat ();
  25.         private Mat mDilatedMask = new Mat ();
  26.         private Mat mHierarchy = new Mat ();
  27.  
  28.         public void SetColorRadius (Scalar radius)
  29.         {
  30.             mColorRadius = radius;
  31.         }
  32.  
  33.         public void SetHsvColor (Scalar hsvColor)
  34.         {
  35.             double minH = (hsvColor.val [0] >= mColorRadius.val [0]) ? hsvColor.val [0] - mColorRadius.val [0] : 0;
  36.             double maxH = (hsvColor.val [0] + mColorRadius.val [0] <= 255) ? hsvColor.val [0] + mColorRadius.val [0] : 255;
  37.        
  38.             mLowerBound.val [0] = minH;
  39.             mUpperBound.val [0] = maxH;
  40.        
  41.             mLowerBound.val [1] = hsvColor.val [1] - mColorRadius.val [1];
  42.             mUpperBound.val [1] = hsvColor.val [1] + mColorRadius.val [1];
  43.        
  44.             mLowerBound.val [2] = hsvColor.val [2] - mColorRadius.val [2];
  45.             mUpperBound.val [2] = hsvColor.val [2] + mColorRadius.val [2];
  46.        
  47.             mLowerBound.val [3] = 0;
  48.             mUpperBound.val [3] = 255;
  49.        
  50.             using (Mat spectrumHsv = new Mat (1, (int)(maxH - minH), CvType.CV_8UC3)) {        
  51.                 for (int j = 0; j < maxH - minH; j++) {
  52.                     byte[] tmp = { (byte)(minH + j), (byte)255, (byte)255 };
  53.                     spectrumHsv.put (0, j, tmp);
  54.                 }
  55.        
  56.                 Imgproc.cvtColor (spectrumHsv, mSpectrum, Imgproc.COLOR_HSV2RGB_FULL, 4);
  57.             }
  58.         }
  59.  
  60.         public Mat GetSpectrum ()
  61.         {
  62.             return mSpectrum;
  63.         }
  64.  
  65.         public void SetMinContourArea (double area)
  66.         {
  67.             mMinContourArea = area;
  68.         }
  69.  
  70.         public void Process (Mat rgbaImage)
  71.         {
  72.             Imgproc.pyrDown (rgbaImage, mPyrDownMat);
  73.             Imgproc.pyrDown (mPyrDownMat, mPyrDownMat);
  74.        
  75.             Imgproc.cvtColor (mPyrDownMat, mHsvMat, Imgproc.COLOR_RGB2HSV_FULL);
  76.        
  77.             Core.inRange (mHsvMat, mLowerBound, mUpperBound, mMask);
  78.             Imgproc.dilate (mMask, mDilatedMask, new Mat ());
  79.        
  80.             List<MatOfPoint> contours = new List<MatOfPoint> ();
  81.        
  82.             Imgproc.findContours (mDilatedMask, contours, mHierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
  83.        
  84.             // Find max contour area
  85.             double maxArea = 0;
  86.             foreach (MatOfPoint each in contours) {
  87.                 MatOfPoint wrapper = each;
  88.                 double area = Imgproc.contourArea (wrapper);
  89.                 if (area > maxArea)
  90.                     maxArea = area;
  91.             }
  92.        
  93.             // Filter contours by area and resize to fit the original image size
  94.             mContours.Clear ();
  95.             foreach (MatOfPoint each in contours) {
  96.                 MatOfPoint contour = each;
  97.                 if (Imgproc.contourArea (contour) > mMinContourArea * maxArea) {
  98.                     Core.multiply (contour, new Scalar (4, 4), contour);
  99.                     mContours.Add (contour);
  100.                 }
  101.             }
  102.         }
  103.  
  104.         public List<MatOfPoint> GetContours ()
  105.         {
  106.             return mContours;
  107.         }
  108.  
  109.         public void Dispose ()
  110.         {
  111.             mSpectrum.Dispose ();
  112.             mPyrDownMat.Dispose ();
  113.             mHsvMat.Dispose ();
  114.             mMask.Dispose ();
  115.             mDilatedMask.Dispose ();
  116.             mHierarchy.Dispose ();
  117.         }
  118.     }
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement