轮廓图OpenCV4Android库
问题描述:
我使用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);
答
如果你在看代码,你会看到他们第一次使用此:
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)
我希望我清楚;)
答
暂时我不能完全回答这个问题,但这里是我得到的。
Core.multiply(contour, new Scalar(4,4), contour);
第一个参数是源矩阵,第二个参数是乘法因子,第三个参数是结果矩阵。如果你有这个想法,那么这个代码就是将源轮廓缩放4倍。
为什么4?这我不知道,但通过上面的代码注释 - “调整大小,以适应原始图像大小” - 我想这个想法是做适合,但我不知道你是如何实现的,通过乘以轮廓4.
热点问题研究ü说已经明显从文件...但要获得所需的BLOB,1)为什么他们需要乘以WID标? 2)当我将它改为标量(3,3)时,轮廓变得很小(明显),但是移动了,我不明白为什么! – sumit 2013-02-14 13:05:50
在你的问题中,你问“是否合并几个小轮廓?”。我认为情况并非如此,所以我试图澄清这一点。 – 2013-02-14 13:38:50