我在一个项目中工作。项目的一部分包括将OpenCV的HOG人员检测器与摄像头流式传输相结合。
目前正在使用相机和基本HOG检测器(CPP detectMultiScale - > http://docs.opencv.org/modules/gpu/doc/object_detection.html)。但是不能很好地工作......检测非常噪音,算法不是很准确......
为什么?
我的相机图像为640 x 480像素。
我正在使用的代码段是:
std::vector<cv::Rect> found, found_filtered;
cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
hog.detectMultiScale(image, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);
为什么不能正常工作?什么需要提高准确性?是否需要一些特定的图像尺寸?
PS:你知道一些精确的人检测算法,更快,并在cpp ??
中发展答案 0 :(得分:33)
默认人物检测器的大小为64x128,这意味着您想要检测的人必须至少为64x128。对于你的相机分辨率,这意味着一个人在被正确检测之前必须占用相当大的空间。
根据您的具体情况,您可以尝试训练自己的HOG描述符,尺寸较小。如果您想训练自己的HOG描述符,可以查看this answer和referenced library。
参数:
<强> win_stride:强> 如果输入图像的大小为640 x 480,而defaultpeopleDetector的窗口大小为64x128,则可以在输入图像中多次调整HOG Detection窗口(64x128窗口)。 winstride告诉HOG每次都将检测窗口移动一定量。 这是如何运作的: Hog将检测窗口放在输入图像的左上角。 并且每次都通过win_stride移动检测窗口。
喜欢这个(小win_stride):
或者像这样(大win_stride)
较小的测试版应提高准确性,但会降低性能,反之则
<强>填充强> 填充在输入图像的每一侧添加一定量的额外像素。这样,检测窗口位于输入图像的外面。这是因为HOG可以检测到非常靠近输入图像边缘的人。
<强> group_threshold 强> group_treshold确定应将检测到的部分放在组中的值。 低值不提供结果分组,如果在检测窗口内找到阈值量,则较高值提供结果分组。 (根据我自己的经验,我从未需要更改默认值)
我希望这对你有点意义。 我过去几周一直在和HOG一起工作,并且阅读了很多论文,但是我丢失了一些参考文献,因此我无法将这些信息来自的页面链接到你,对不起。