1

我正在尝试开发一个应用程序来检测某些对象,例如人、车辆和树​​木。作为开始,我尝试移植OpenCV 行人样本,但我得到了一个非常低的帧速率和很多误报。

由于我刚刚开始使用 OpenCV 并且对 C++ 也不太了解,因此我可能做出了不正确的解释和昂贵的计算。

@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    Mat frame = inputFrame.rgba();

    float minScale = 0.4f, maxScale = 5;    /* minimum and maximum scale to detect */
    int totalScales = 55;                   /* preferred number of scales between min and max */
    int threshold = -1;                     /* detections with score less then threshold will be ignored */

    HOGDescriptor hog = new HOGDescriptor();
    hog.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector());

    MatOfRect foundLocations = new MatOfRect();
    MatOfDouble foundWeights = new MatOfDouble();

    Mat tempMat = new Mat(frame.rows(), frame.cols(), CvType.CV_8UC3);
    Imgproc.cvtColor(frame, tempMat, Imgproc.COLOR_RGBA2RGB);

    hog.detectMultiScale(tempMat, foundLocations, foundWeights, 1.5, new Size(8,8),
            new Size(32, 32), 1.05, 2, false);

    Vector<Rect> foundLocationsFilteredList = new Vector<Rect>();
    filterRects(foundLocations.toList(), foundLocationsFilteredList);

    for (Rect foundLocation : foundLocationsFilteredList) {
        Core.rectangle(frame, foundLocation.tl(), foundLocation.br(), new Scalar(0, 255, 0), 3);
    }

    tempMat.release();
    return frame;
}

private final void filterRects(List<Rect> candidates, List<Rect> objects) {
    for (int i = 0; i < candidates.size(); ++i) {
        Rect r = candidates.get(i);

        int j;
        for (j = 0; j < candidates.size(); ++j) {
            if (j != i && r.equals(candidates.get(j)))
                break;
        }

        if (j == candidates.size())
            objects.add(r);
    }
}
  • 如果使用 JNI 完成帧处理会更快吗?还是采用不同的方法会更好?
  • 我应该如何进行多物体检测
4

1 回答 1

0

JNI 无疑加速了这个过程。OpenCV4Android 包中有一个 JNI 示例。我已经使用 OpenCV 在 Android 上编写了一些程序,而 JNI 对我来说非常有用。这是一个人脸检测示例。用您自己的物体检测器替换检测器。

对于各种检测器,参数中指定检测多个或单个对象。转到文档。大多数时候,检测器默认返回多个结果。

编辑

这是使用 OpenCV 的 JNI 示例。最初的跟踪器是 C++ 的,我将它改编为 Android。欢迎叉。

链接到项目

于 2013-08-19T01:16:33.990 回答