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