我正在使用OpenCv4Android库,并通过示例程序color-blob-detection。 在这里,为了绘制轮廓,他们首先用表达式过滤它: (轮廓面积> 0.1 *(最大轮廓面积)
if (Imgproc.contourArea(contour) > mMinContourArea*maxArea) {
Core.multiply(contour, new Scalar(4,4), contour);
mContours.add(contour);
然后,他们对每个过滤后的轮廓使用标量乘法。它的目的是什么?是合并几个小轮廓?没有得到这个想法。 PLZ启迪!! 第二件事,为什么他们使用乘法因子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);
答案 0 :(得分:1)
如果您查看代码,您会看到他们首先使用此代码:
Imgproc.pyrDown(rgbaImage, pyrDownMat); //Divide length and height by 2
Imgproc.pyrDown(pyrDownMat, pyrDownMat); //Divide length and height by 2
在这些线条中,框架长度和高度除以4,这将减少所需的处理时间。 要将轮廓放回到原始框架上,他们必须将长度和高度调整为4,这就是原因,这条线被使用。
new Scalar(4,4)
我希望我说得清楚;)
答案 1 :(得分:0)
暂时我无法完全回答这个问题,但这就是我得到的。
Core.multiply(contour, new Scalar(4,4), contour);
第一个参数是源矩阵,第二个参数是乘法因子,第三个参数是结果矩阵。如果考虑到这一点,该代码将源轮廓缩放4倍。
为什么4?这个我不知道,但是通过上面的评论代码 - “调整大小以适应原始图片大小” - 我想这个想法是做那个拟合,但我不知道你是如何通过将轮廓乘以4来实现这一目标。