如何改进openCV人检测算法

时间:2016-11-17 15:53:14

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

我正在尝试编写人体探测器,现在可以正常工作,但有时它会对猫/盒子等作出反应,而且我也会得到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;
        }

1 个答案:

答案 0 :(得分:0)

您正在使用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模块进行检测。 / p>