OpenCV 目标检测边界框

标签 opencv svm feature-detection object-detection

我正在使用 OpenCV 中的 SVM 进行实时对象检测。我的对象包括书本、杯子、盒子、监视器和负训练样本。

  • 特征检测器 - SURF
  • 每个正图像的样本 - 每个 200 个(从 Web 获取)
  • 负样本 - 400 张图片

  • 训练 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/

    相关文章:

    python - 我如何格式化我的列表以将其作为 opencv3.0 中 svm.train() 的输入

    python - 特征匹配的图像相似性度量?

    javascript - 仅显示客户服务功能页面底部的移动 View 和滚动条

    python - featureFormat() 函数删除了一些点?

    python - 使用OpenCV Python查找等效的imagemagick morphology命令

    opencv - libsvm 能否将预测结果作为有符号距离返回?

    python - 如何在 opencv 中仅提取 nxn 图像的 3 个特征向量?

    python - 为什么支持向量机二元分类中的决策边界在我的图上重叠?

    c++ - calibrateCamera() 中的 Opencv 错误 : assertion failled i < 0,

    c++ - OpenCV 2.3 C++ 基础图像处理