java - OpenCV HOGDescriptor 在静态图像中返回错误结果

标签 java android opencv

我正在尝试使用 Android 中的 OpenCV HOGDescriptor 检测静态图像中是否存在人体。

这里是Android java代码,我在网上找不到Android中的示例,我尝试将peopledetect.cpp中的C++示例移植到它。

mHOGDescriptor = new HOGDescriptor();
mHOGDescriptor.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector());
Mat img = Highgui.imread(path);
final MatOfRect foundLocations = new MatOfRect();
final MatOfDouble foundWeights = new MatOfDouble();
final Size winStride = new Size(8, 8);
final Size padding = new Size(32, 32);

mHOGDescriptor.detectMultiScale(img, foundLocations, foundWeights, 0.0, winStride, padding, 1.05, 2.0, false);
Boolean withFace = false;
Rect[] array = foundLocations.toArray();
for (int j = 0; j < array.length; j++) {
    Rect rect = array[j];
    Log.i("TEST", "Height " + rect.height + ", Width " + rect.width);
}

当我再次测试一小部分 30 张照片时,我注意到误报的数量非常高。一些没有明显人物特征的照片也被标记为人物。 (在上面的foundLocation数组中,矩形的高度和宽度都相当高)。例如,一张有几朵花的照片被标记为里面有 2 个人。很明显是错误的。

我可以做些什么来改进它吗?

最佳答案

简短的回答是,是的,有。

如果我理解正确的话,您已经在 30 张照片上训练了描述符?这是一个非常低的数字,通过增加训练数据量会增加检测次数。

<小时/>

以防万一,您的意思是您正在测试在 C++ 代码中使用的相同描述符,并且可以正常工作,那么这里有一个稍微不同的答案。

特征检测是一件非常难以掌握的事情,即使使用非常好的 HOG 检测器,您也可能会得到很多误报。你没有提到你的真实阳性率如何,我认为它还不错。想象一下,一朵花在被训练来检测人类的东西面前是什么样子,它是一个细长的东西,顶部有一个大圆圈;和一个人很相似...

关于java - OpenCV HOGDescriptor 在静态图像中返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23967297/

相关文章:

java - 如何延迟 ScheduledExecutorService?

Java GUI 按钮不会将字符串打印到界面

android - 如何仅在我的数字时钟中显示下午

c++ - OpenCV 创建每行包含多个图像的矩阵

python - 如何在Python中保存灰度图像?

java - 配置 Intellij 的 "New Project"默认值以使用 Spring MVC 版本 5

Java - 将 byte[] 转换为 char[]。编码是UTF-16

android - 隔板和容器之间的空间 flutter

android - 运行错误 'app' : Unknown error in Android studio 3. 1

python - 如何在 Python 中检测边缘并裁剪图像