我正在使用OpenCv4Android库,并通过示例程序进行色块检测。
在这种情况下,要绘制轮廓,他们首先使用表达式过滤:
(轮廓区域> 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);

最佳答案

如果看一下代码,您将看到他们首先使用了此代码:

Imgproc.pyrDown(rgbaImage, pyrDownMat); //Divide length and height by 2
Imgproc.pyrDown(pyrDownMat, pyrDownMat); //Divide length and height by 2

在这些行中,框架的长度和高度被四分,这将减少所需的处理时间。
要将轮廓放回原始框架,必须将长度和高度调整为4,这就是原因,使用了这条线。
new Scalar(4,4)

我希望我说清楚了;)

关于android - 等高线图OpenCV4Android库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14855905/

10-09 04:32