我正在使用 OpenCV 中的 SVM 进行实时对象检测。我的对象包括书本、杯子、盒子、监视器和负训练样本。
训练 SVM 后,我可以正确识别包含对象的帧。但我无法在对象周围放置正确的边界框。
对于单个对象和场景图像,http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html OpenCV 的本教程提供了有关如何执行检测和放置边界框的见解。
现在就我而言,我有 200 个对象的裁剪图像,如何确定环境中对象周围正确边界框的正确位置和大小。这就是我如何知道训练集中的哪个图像是最佳匹配的。
最佳答案
如果您现在,从您的 SVM 中,哪个对象可能在图像中,您可以使用仅包含您的对象的图像作为“对象图像”,将当前样本作为“场景图像”。
比你可以关注 Example “Features2D + Homography to find a known object”(你已经提到过)来找到你的对象在场景中的位置。如果您只想绘制边界框(而不是匹配的特征),只需从对象中提取角点(示例中的代码):
//-- Get the corners from the image_1 ( the object to be "detected" )
std::vector<Point2f> obj_corners(4);
obj_corners[0] = cvPoint(0,0);
obj_corners[1] = cvPoint( img_object.cols, 0 );
obj_corners[2] = cvPoint( img_object.cols, img_object.rows );
obj_corners[3] = cvPoint( 0, img_object.rows );
并将它们转换为场景坐标
std::vector<Point2f> scene_corners(4);
perspectiveTransform( obj_corners, scene_corners, H);
假设您已经计算了单应矩阵
H
.现在您在场景坐标中有了角点,并且可以简单地在角点之间绘制线以获得您的边界框(示例中的代码):
//-- Draw lines between the corners (the mapped object in the scene - image_2 )
line( img_matches, scene_corners[0] + Point2f( img_object.cols, 0), scene_corners[1] + Point2f( img_object.cols, 0), Scalar(0, 255, 0), 4 );
line( img_matches, scene_corners[1] + Point2f( img_object.cols, 0), scene_corners[2] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[2] + Point2f( img_object.cols, 0), scene_corners[3] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
line( img_matches, scene_corners[3] + Point2f( img_object.cols, 0), scene_corners[0] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );
重要的是您的“object_image”只包含对象而不包含其他内容。
如果您想从您的类(class)中获得最好的样本,您必须计算每个样本的分数。这可以使用 Wu 等人的“通过成对耦合进行多类分类的概率估计”中描述的方法来完成。人。你可以找到here .
然而,这对于实时应用程序来说可能太慢了。
关于OpenCV 目标检测边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20185895/