【问题标题】:How can i improve openCV people detecting algorithm我如何改进openCV人员检测算法
【发布时间】:2017-04-01 06:13:10
【问题描述】:

我正在尝试编写人体探测器,它现在可以工作,但有时它会对猫/盒子等做出反应,我也得到了 5 fps。所以问题是,如何改进我的算法以获得更好的 fps 和检测精度。

我试过用这个: http://www.pyimagesearch.com/2015/11/09/pedestrian-detection-opencv/

但我找不到任何可以在 android 上使用它的方法。

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {    
        List<MatOfPoint> list = new ArrayList<>();
            Mat frame = new Mat();
            Mat gray = new Mat();
            Mat hierarchy = new Mat();
            Mat originalFrame = inputFrame.rgba();


            Imgproc.medianBlur(originalFrame,originalFrame,3);
            Imgproc.cvtColor(originalFrame, gray, Imgproc.COLOR_RGB2GRAY, 0);

            HOGDescriptor hog = new HOGDescriptor();
            //Получаем стандартный определитель людей и устанавливаем его нашему дескриптору
            MatOfFloat descriptors = HOGDescriptor.getDefaultPeopleDetector();
            hog.setSVMDetector(descriptors);
            MatOfRect locations = new MatOfRect();
            MatOfDouble weights = new MatOfDouble();
            hog.detectMultiScale(gray, locations, weights);

            Point rectPoint1 = new Point();
            Point rectPoint2 = new Point();
            Point fontPoint = new Point();

            if (locations.rows() > 0) {
                List<Rect> rectangles = locations.toList();
                for (Rect rect : rectangles) {
                    rectPoint1.x = rect.x;
                    rectPoint1.y = rect.y;
                    fontPoint.x  = rect.x;
                    fontPoint.y  = rect.y - 4;
                    rectPoint2.x = rect.x + rect.width;
                    rectPoint2.y = rect.y + rect.height;
                    final Scalar rectColor = new Scalar( 0  , 0 , 0  );
                    // Добавляем на изображения найденную информацию
                    Imgproc.rectangle(originalFrame, rectPoint1, rectPoint2, rectColor, 2);
                }
            }


            frame.release();
            gray.release();
            hierarchy.release();
            list.clear();

            return originalFrame;
        }

【问题讨论】:

    标签: android c++ algorithm opencv object-detection


    【解决方案1】:

    您正在使用 HOG+SVM 方法来检测人员;它本质上会很慢。无论如何,您可以使用此问题中的一些建议How to speed up svm.predict?

    根据您的问题,即如果相机是静态的并且行人正在移动,您可以选择背景减法方法,这可能是最有效的方法,但请记住,这将拾取任何在场景,因此您可以包含阈值以删除小对象。一些背景减法算法包括混合高斯 (MOG) 或 MOG2 或 GMG。此外,需要注意的重要一点是,这些方法依赖于创建场景的背景模型,即它们假设随着时间的推移静态像素成为背景的一部分,因此,当行人在场景中静止一段时间时,他们会得到嵌入到背景中导致漏检。有许多论文提供了该问题的潜在解决方案,因此您可能想看看它们,这里有一篇产生了不错的结果:Static and Moving Object Detection Using Flux Tensor with Split Gaussian Models

    此外,您可以选择数据驱动的方法,或者获得一个好的预训练模型并使用它进行检测,或者使用 TensorFlow、Caffe 或 Torch 自己训练一个模型,然后使用 dnn opencv_contrib 模块进行检测。

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2016-05-01
      • 2020-10-16
      • 2011-01-12
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多