OpenCV对象检测边界框

时间:2013-11-25 06:13:01

标签: opencv svm feature-detection object-detection

我正在使用OpenCV中的SVM进行实时对象检测。我的对象包括书,马克杯,盒子,显示器和负面训练样本。

  1. 特征检测器 - SURF
  2. 每张正片的样本 - 每张200张(从网上获取)
  3. 负样本 - 400张图片
  4. 训练SVM后,我可以正确识别包含该对象的帧。但是我无法在对象周围放置一个正确的边界框。

    对于单个对象和场景图像,来自OpenCV的本教程http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html提供了如何执行边界框检测和放置的深入见解。

    现在在我的情况下,我有200个对象的裁剪图像,如何确定环境中对象周围的正确位置和正确边界框的大小。这就是我知道训练集中哪个图像是最佳匹配的方式。

1 个答案:

答案 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

然而,对于实时应用来说,这可能太慢了。