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