2013-02-13 159 views
2

我使用OpenCv4Android库,并通过示例程序color-blob-detection。 在此,画轮廓,它们首先与表达筛选它: (轮廓的面积> 0.1 *(最大轮廓的后,他们利用标量乘法的每个经滤波的区域)轮廓图OpenCV4Android库

if (Imgproc.contourArea(contour) > mMinContourArea*maxArea) { 
      Core.multiply(contour, new Scalar(4,4), contour); 
      mContours.add(contour); 

然后轮廓。?作用是什么?它是合并几个小轮廓?没得到的想法。PLZ开导! 第二件事情,为什么他们用倍增因数标量(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); 

回答

1

如果你在看代码,你会看到他们第一次使用此:

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) 

我希望我清楚;)

0

暂时我不能完全回答这个问题,但这里是我得到的。

Core.multiply(contour, new Scalar(4,4), contour); 

第一个参数是源矩阵,第二个参数是乘法因子,第三个参数是结果矩阵。如果你有这个想法,那么这个代码就是将源轮廓缩放4倍。

为什么4?这我不知道,但通过上面的代码注释 - “调整大小,以适应原始图像大小” - 我想这个想法是做适合,但我不知道你是如何实现的,通过乘以轮廓4.

+0

热点问题研究ü说已经明显从文件...但要获得所需的BLOB,1)为什么他们需要乘以WID标? 2)当我将它改为标量(3,3)时,轮廓变得很小(明显),但是移动了,我不明白为什么! – sumit 2013-02-14 13:05:50

+0

在你的问题中,你问“是否合并几个小轮廓?”。我认为情况并非如此,所以我试图澄清这一点。 – 2013-02-14 13:38:50