OpenCV多标记检测?

时间:2015-02-09 10:48:05

标签: opencv computer-vision

我一直致力于检测场景中的基准标记。我的基准标记的一个例子是: http://tinypic.com/view.php?pic=4r6k3q&s=8#.VNgsgzVVK1F

我能够很好地检测到场景中的单个基准标记。检测场景中多个基准标记的方法是什么?进行特征检测,提取和匹配对于查找单个匹配非常有用,但它似乎是检测多个匹配的错误方法,因为很难确定哪些特征属于哪个标记?

基准标记将是相同的,并且不会在场景中的已知位置。

更新

下面是一些示例代码。我试图将第一个基准标记与 x 关键点数匹配,然后使用剩余的关键点来匹配第二个标记。但是,这根本不健全。有人有什么建议吗?

OrbFeatureDetector detector;
vector<KeyPoint> keypoints1, keypoints2; 

detector.detect(im1, keypoints1);
detector.detect(im2, keypoints2);

Mat display_im1, display_im2;
drawKeypoints(im1, keypoints1, display_im1, Scalar(0,0,255));
drawKeypoints(im2, keypoints2, display_im2, Scalar(0,0,255));

SiftDescriptorExtractor extractor;

Mat descriptors1, descriptors2;

extractor.compute( im1, keypoints1, descriptors1 );
extractor.compute( im2, keypoints2, descriptors2 );

BFMatcher matcher;
vector< DMatch > matches1, matches2;
matcher.match( descriptors1, descriptors2, matches1 );
sort (matches1.begin(), matches1.end());
matches2 = matches;
int numElementsToSave = 50;

matches1.erase(matches1.begin()+numElementsToSave,matches1.end());
matches2.erase(matches2.begin(),matches2.begin()+numElementsToSave);

Mat match_im1, match_im2;
drawMatches( im1, keypoints1, im2, keypoints2,
    matches1, match_im1, Scalar::all(-1), Scalar::all(-1),
    vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

drawMatches( im1, keypoints1, im2, keypoints2,
    matches2, match_im2, Scalar::all(-1), Scalar::all(-1),
    vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

2 个答案:

答案 0 :(得分:0)

我之前从未尝试过,但在这里你对多次出现的检测有一个很好的解释:

  

本教程介绍如何启用多重检测   宾语。要启用多重检测,请参数   应该检查General->multiDetection。方法如下   以下内容:

     
      
  • 像往常一样,我们匹配对象和场景之间的所有功能。
  •   
  • 对于场景中两次(或更多)的对象,它应具有两次匹配的特征。我们应用RANSAC算法来查找   单应。内点应该只属于一次出现   对象,所有其他被视为异常值。我们重做了单应性   对异常值进行处理,然后找到另一个单应性...我们这样做   过程直到无法计算单应性。
  •   
  • 可能会发现使用异常值可以在前一个上发现单应性。你可以设置   Homography->ransacReprojThr(以像素为单位)更高以接受更多   计算单应性中的内点,这将减少机会   叠加的检测。另一种方法是忽略叠加   指定半径上的单应性,参数为General->multiDetectionRadius(以像素为单位)。
  •   

有关详细信息,请参阅以下页面:
https://code.google.com/p/find-object/wiki/MultiDetection

答案 1 :(得分:0)

我开发了一种半自动算法,在二进制图像上使用findContours方法从图像中检测多个标记(兴趣点)(我的标记在绿色表面上是白色的,然后我将搜索限制为区域约束,因为我知道每一帧中的每个标记有多大。当然这有一些误报,但它已经足够好了。由于某些原因,我无法在你的帖子中看到图片因为tinypic被阻止了。但你可以使用{ {1}} opencv函数消除不良轮廓。 这是我为此制作的代码的一部分。

matchShape

我希望这会有所帮助