私は OpenCv4Android ライブラリを使用しており、サンプル プログラム color-blob-detection を使用しています。これでは、輪郭を描くために、最初に次の式でフィルタリングします:(輪郭の面積> 0.1 *(最大の輪郭の面積)
if (Imgproc.contourArea(contour) > mMinContourArea*maxArea) {
Core.multiply(contour, new Scalar(4,4), contour);
mContours.add(contour);
その後、フィルタリングされた輪郭のそれぞれにスカラー乗算を使用しました。その目的は何ですか?いくつかの小さな輪郭をマージすることですか?アイデアがわかりませんでした。啓発してください!! 第二に、なぜ彼らは乗算係数 Scalar(4,4) を使用したのか、なぜ他のものを使用しなかったのか。
コード :
Imgproc.pyrDown(rgbaImage, mPyrDownMat);
Imgproc.pyrDown(mPyrDownMat, mPyrDownMat);
Imgproc.cvtColor(mPyrDownMat, mHsvMat, Imgproc.COLOR_RGB2HSV_FULL);
Core.inRange(mHsvMat, mLowerBound, mUpperBound, mMask);
Imgproc.dilate(mMask, mDilatedMask, new Mat());
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(mDilatedMask, contours, mHierarchy, 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);
Imgproc.drawContours(mRgba, mContours, -1, CONTOUR_COLOR);