Java OpenCV描述符在静态图像中返回错误结果

Java OpenCV描述符在静态图像中返回错误结果,java,android,opencv,Java,Android,Opencv,我试图用Android中的OpenCV描述符在静态图像中检测人类的存在 这是Android java代码,我找不到Android在线的例子,我尝试将C++中的例子用PoePosiTebug .CPP移植到它上面。 mHOGDescriptor = new HOGDescriptor(); mHOGDescriptor.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector()); Mat img = Highgui.imread(path);

我试图用Android中的OpenCV描述符在静态图像中检测人类的存在

这是Android java代码,我找不到Android在线的例子,我尝试将C++中的例子用PoePosiTebug .CPP移植到它上面。

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);
}
mHOGDescriptor=新的HOGDescriptor();
mHOGDescriptor.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector());
Mat img=Highgui.imread(路径);
最终MatOfRect foundLocations=新MatOfRect();
最终MatOfDouble foundWeights=新MatOfDouble();
最终尺寸=新尺寸(8,8);
最终尺寸填充=新尺寸(32,32);
mHOGDescriptor.detectMultiScale(img、foundLocations、foundWeights、0.0、winStride、padding、1.05、2.0、false);
布尔withFace=false;
Rect[]数组=foundLocations.toArray();
对于(int j=0;j
当我再次测试一小组30张照片时,我注意到假阳性的数量非常高。一些没有明显人物特征的照片也被标记为带有人物。(在上面的foundLocation数组中,rect的高度和宽度都很高)。例如,一张有几朵花的照片上有两个人在里面。很明显,这是错误的


我能做些什么来改进它吗?

简而言之,是的,有

如果我理解正确,你已经在30张照片上训练了你的描述?这是一个非常低的数字,通过增加训练数据量,可以提高检测率


如果你是在测试你在C++代码中使用的相同描述符,那么这里有一个稍微不同的答案。
特征检测是一件很难掌握的事情,即使有一个很好的HOG检测器,也可能会出现很多误报。如果你没有提到你的真实阳性率,我会假设它还不错。想象一下,一朵花被训练用来探测人的样子,它是一个细长的东西,顶部有一个大圆圈;很像一个人…

很抱歉,我是图像识别的初学者。我不懂描述符的训练。我认为通过调用“setVMDetector(HOGDescriptor.getDefaultPeopleDetector())”可以设置OpenCV已经设置(训练)的正确检测器。我们必须自己提供培训设备吗?我引用C++中的一些例子(例如OpenCV SDK中的PoePosithCopenc.CPP),我不认为它们必须训练它们自己的描述符。这30张照片实际上是我的测试用例。我运行的代码是30张照片,没有人,他们中的大多数是错误的。BTW,我也尝试运行C++实例提供的OpenCV SDK,PoePosiDeCurt.CPP,结果也非常令人失望。有些照片显然没有一个人,但它仍然突出了作为一个人的一个角落。我不确定这些评论是否与最初的问题有关。你是在问它应该工作得怎么样?最初的问题只是问你为什么会收到错误消息…嗯?我没有说我在原始问题中收到错误消息。我的意思是,我按照上面的代码运行detectMultiScale(),将许多区域检测为person(foundLocations)。当我在同一张照片中标记这些区域并给出结果示例时,它们显然是错误的。i、 e.标记区域,明显没有检测到人。我的错误,我把问题搞混了。计算机视觉不是一项容易的任务。查看其他人的当前结果,看看你的结果是否正确similar@pri-请不要将代码标记用于非代码的内容。