我正在使用OpenCV中的SVM进行实时对象检测。我的对象包括书,马克杯,盒子,显示器和负面训练样本。
训练SVM后,我可以正确识别包含该对象的帧。但是我无法在对象周围放置一个正确的边界框。
对于单个对象和场景图像,来自OpenCV的本教程http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html提供了如何执行边界框检测和放置的深入见解。
现在在我的情况下,我有200个对象的裁剪图像,如何确定环境中对象周围的正确位置和正确边界框的大小。这就是我知道训练集中哪个图像是最佳匹配的方式。
答案 0 :(得分:1)
如果您现在,从您的SVM中,哪个对象可以在图像中,您可以使用仅包含对象的图像作为“对象图像”,将当前样本用作“场景图像”。
您可以按照Example“Features2D + Homography查找已知对象”(您已经提到过)来查找对象在场景中的位置。如果您只想绘制边界框(而不是匹配的特征),只需从对象中提取角点(示例中的代码):
//-- 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);
假设您已经计算了Homography矩阵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”仅包含Object而不包含任何其他内容。
如果您想从班级中获得最佳样本,您必须计算每个样本的分数。这可以使用Wu等人的“通过成对耦合进行多级分类的概率估计”中描述的方法来完成。人。您可以找到here。
然而,对于实时应用来说,这可能太慢了。