mirror of https://github.com/opencv/opencv.git
CodeReview #1511 notes upplied.
parent
314813e51c
commit
5c528defb8
3 changed files with 160 additions and 120 deletions
@ -0,0 +1,119 @@ |
|||||||
|
package org.opencv.samples.colorblobdetect; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import org.opencv.core.Core; |
||||||
|
import org.opencv.core.CvType; |
||||||
|
import org.opencv.core.Mat; |
||||||
|
import org.opencv.core.MatOfPoint; |
||||||
|
import org.opencv.core.Scalar; |
||||||
|
import org.opencv.imgproc.Imgproc; |
||||||
|
|
||||||
|
public class ColorBlobDetector |
||||||
|
{ |
||||||
|
public void setColorRadius(Scalar radius) |
||||||
|
{ |
||||||
|
mColorRadius = radius; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHsvColor(Scalar hsvColor) |
||||||
|
{ |
||||||
|
double minH = (hsvColor.val[0] >= mColorRadius.val[0]) ? hsvColor.val[0]-mColorRadius.val[0] : 0; |
||||||
|
double maxH = (hsvColor.val[0]+mColorRadius.val[0] <= 255) ? hsvColor.val[0]+mColorRadius.val[0] : 255; |
||||||
|
|
||||||
|
mLowerBound.val[0] = minH; |
||||||
|
mUpperBound.val[0] = maxH; |
||||||
|
|
||||||
|
mLowerBound.val[1] = hsvColor.val[1] - mColorRadius.val[1]; |
||||||
|
mUpperBound.val[1] = hsvColor.val[1] + mColorRadius.val[1]; |
||||||
|
|
||||||
|
mLowerBound.val[2] = hsvColor.val[2] - mColorRadius.val[2]; |
||||||
|
mUpperBound.val[2] = hsvColor.val[2] + mColorRadius.val[2]; |
||||||
|
|
||||||
|
mLowerBound.val[3] = 0; |
||||||
|
mUpperBound.val[3] = 255; |
||||||
|
|
||||||
|
Mat spectrumHsv = new Mat(1, (int)(maxH-minH), CvType.CV_8UC3); |
||||||
|
|
||||||
|
for (int j = 0; j < maxH-minH; j++) |
||||||
|
{ |
||||||
|
byte[] tmp = {(byte)(minH+j), (byte)255, (byte)255}; |
||||||
|
spectrumHsv.put(0, j, tmp); |
||||||
|
} |
||||||
|
|
||||||
|
Imgproc.cvtColor(spectrumHsv, mSpectrum, Imgproc.COLOR_HSV2RGB_FULL, 4); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public Mat getSpectrum() |
||||||
|
{ |
||||||
|
return mSpectrum; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMinContourArea(double area) |
||||||
|
{ |
||||||
|
mMinContourArea = area; |
||||||
|
} |
||||||
|
|
||||||
|
public void process(Mat rgbaImage) |
||||||
|
{ |
||||||
|
Mat pyrDownMat = new Mat(); |
||||||
|
|
||||||
|
Imgproc.pyrDown(rgbaImage, pyrDownMat); |
||||||
|
Imgproc.pyrDown(pyrDownMat, pyrDownMat); |
||||||
|
|
||||||
|
Mat hsvMat = new Mat(); |
||||||
|
Imgproc.cvtColor(pyrDownMat, hsvMat, Imgproc.COLOR_RGB2HSV_FULL); |
||||||
|
|
||||||
|
Mat Mask = new Mat(); |
||||||
|
Core.inRange(hsvMat, mLowerBound, mUpperBound, Mask); |
||||||
|
Mat dilatedMask = new Mat(); |
||||||
|
Imgproc.dilate(Mask, dilatedMask, new Mat()); |
||||||
|
|
||||||
|
List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); |
||||||
|
Mat hierarchy = new Mat(); |
||||||
|
|
||||||
|
Imgproc.findContours(dilatedMask, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); |
||||||
|
|
||||||
|
// Find max contour area
|
||||||
|
double maxArea = 0; |
||||||
|
Iterator<MatOfPoint> each = contours.iterator(); |
||||||
|
while (each.hasNext()) |
||||||
|
{ |
||||||
|
MatOfPoint wrapper = each.next(); |
||||||
|
double area = Imgproc.contourArea(wrapper); |
||||||
|
if (area > maxArea) |
||||||
|
maxArea = area; |
||||||
|
} |
||||||
|
|
||||||
|
// Filter contours by area and resize to fit the original image size
|
||||||
|
mContours.clear(); |
||||||
|
each = contours.iterator(); |
||||||
|
while (each.hasNext()) |
||||||
|
{ |
||||||
|
MatOfPoint contour = each.next(); |
||||||
|
if (Imgproc.contourArea(contour) > mMinContourArea*maxArea) |
||||||
|
{ |
||||||
|
Core.multiply(contour, new Scalar(4,4), contour); |
||||||
|
mContours.add(contour); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public List<MatOfPoint> getContours() |
||||||
|
{ |
||||||
|
return mContours; |
||||||
|
} |
||||||
|
|
||||||
|
// Lower and Upper bounds for range checking in HSV color space
|
||||||
|
private Scalar mLowerBound = new Scalar(0); |
||||||
|
private Scalar mUpperBound = new Scalar(0); |
||||||
|
// Minimum contour area in percent for contours filtering
|
||||||
|
private static double mMinContourArea = 0.1; |
||||||
|
// Color radius for range checking in HSV color space
|
||||||
|
private Scalar mColorRadius = new Scalar(25,50,50,0); |
||||||
|
private Mat mSpectrum = new Mat(); |
||||||
|
private List<MatOfPoint> mContours = new ArrayList<MatOfPoint>();; |
||||||
|
} |
Loading…
Reference in new issue