我一直致力于检测场景中的基准标记。我的基准标记的一个例子是: 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 );
答案 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
我希望这会有所帮助