OpenCV for Java: HoughCircles找到所有错误的圆圈



我是OpenCV的新手,我想在对象检测方面工作,以帮助我的FRC机器人团队。我正在尝试使用HSV滤镜和HoughCircles在网络摄像头图像中找到一个网球,并在它周围画一个圆圈。下面是我的代码:

Mat currentFrame = new Mat();
Mat hsv = new Mat();
Mat threshImage = new Mat();
Mat circles = new Mat();
while (true) {
    camera.read(currentFrame);
    Imgproc.resize(currentFrame, currentFrame, new Size(WIDTH, HEIGHT));
    Imgproc.cvtColor(currentFrame, hsv, Imgproc.COLOR_RGB2HSV);
    hsvWindow.showImage(hsv);
    Core.inRange(hsv, new Scalar(50, 100, 0), new Scalar(95, 255, 255), threshImage);
    threshWindow.showImage(threshImage);
    Imgproc.HoughCircles(threshImage, circles, Imgproc.CV_HOUGH_GRADIENT, 2, 100, 100, 100, 0, 500);
    for (int i = 0; i < circles.cols(); i++) {
        double[] vCircle = circles.get(0, i);
        Point pt = new Point(Math.round(vCircle[0]), Math.round(vCircle[1]));
        int radius = (int)Math.round(vCircle[2]);
        Core.circle(currentFrame, pt, radius, new Scalar(255, 0, 0), 2);
    }
    drawWindow.showImage(currentFrame);
}

原始图像、hsv图像和过滤后的图像都在这个相册中:https://i.stack.imgur.com/Nr1le.jpg

当我用这里的参数运行HoughCircles时,它在钢琴凳和玩具兔子上找到了圆圈,但没有找到网球,网球显示为一个大的白色圆圈。

我修好了!在对HoughCircles的参数进行了一些调整,对二值图像进行了模糊和阈值处理后,它发现它是可靠的,但圆是抖动的,不一致的。所以,我用findContours替换了HoughCircles,在等高线中循环寻找最大的一个,并使用minEnclosingCircle。下面是代码:

Mat currentFrame = new Mat(), hsv = new Mat(), threshImage = new Mat();
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
while (true) {
    camera.read(currentFrame);
    Imgproc.resize(currentFrame, currentFrame, new Size(WIDTH, HEIGHT));
    Imgproc.cvtColor(currentFrame, hsv, Imgproc.COLOR_RGB2HSV);
    hsvWindow.showImage(hsv);
    Core.inRange(hsv, new Scalar(50, 100, 50), new Scalar(95, 255, 255), threshImage);
    Imgproc.blur(threshImage, threshImage, new Size(10, 10));
    Imgproc.threshold(threshImage, threshImage, 150, 255, Imgproc.THRESH_BINARY);
    threshWindow.showImage(threshImage);
    Imgproc.findContours(threshImage, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
    double maxArea = 0;
    float[] radius = new float[1];
    Point center = new Point();
    for (int i = 0; i < contours.size(); i++) {
        MatOfPoint c = contours.get(i);
        if (Imgproc.contourArea(c) > maxArea) {
            MatOfPoint2f c2f = new MatOfPoint2f(c.toArray());
            Imgproc.minEnclosingCircle(c2f, center, radius);
        }
    }
    Core.circle(currentFrame, center, (int)radius[0], new Scalar(255, 0, 0), 2);
    drawWindow.showImage(currentFrame);
}

我知道这对那些想要使用HoughCircles的人来说可能不是特别有帮助,但它证明了模糊二值图像的力量。如果你在众多物体中寻找一个圆,你可以寻找等高线,并将等高线的面积与其围圆的面积进行比较。

相关内容

  • 没有找到相关文章

最新更新