人、車、木などの特定のオブジェクトを検出するアプリケーションを開発しようとしています。まず、 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 を使用した場合、フレーム処理は高速になりますか? それとも、別のアプローチを採用した方がよいでしょうか。
- 複数のオブジェクトを検出するにはどうすればよいですか