我正在尝试将关键点从一个向量复制到另一个关键点向量。我想这样做,以便我可以拆分关键点来线程化它们。以下是通过使用找到的所有关键点完成的。 (复制是问题,而不是分裂,这些是在主线程中完成的,这里没有线程)
复制后 keypoint1 和 keypoint2 的值相同,但当我通过提取描述符和匹配算法时,keypoint1和keypoint2产生不同的结果。< / p>
keypoint1 会产生准确的结果,而 keypoint2 会产生大量错误的结果。我使用ORB algorithm
来检测关键点和描述符提取,使用FlannBasedMatcher
进行匹配。我尝试了一些方法来复制关键点,我也尝试了push_back()
,但它也一样。
方法1:
keypoint2.clear();
keypoint2.insert(keypoint2.begin(), keypoint1.begin(), keypoint1.end());
方法2:
keypoint2.clear();
keypoint2.resize(keypoint1.size());
for (int i = 0; i < keypoint1.size(); ++i) {
keypoint2[i].pt.x = keypoint1[i].pt.x;
keypoint2[i].pt.y = keypoint1[i].pt.y;
keypoint2[i].size = keypoint1[i].size;
keypoint2[i].angle = keypoint1[i].angle;
keypoint2[i].response = keypoint1[i].response;
keypoint2[i].octave = keypoint1[i].octave;
keypoint2[i].class_id = keypoint1[i].class_id;
}
复制关键点后
extractor->compute(GrayImage2, keypoint2, descriptor_img2);
matcher.match(descriptor_img1, descriptor_img2, matches);
我可以说它错了,因为在这一步之后,它们会经历相同的过滤步骤以获得更好的结果。使用keypoint1和keypoint2的正确数据量的差异非常大。
我尝试使用指针来分割关键点,但是我无法指向指向关键点向量的一部分。
更新
最初的计划是使用roi将图像拆分为多个部分,并使用带有std :: thread的detect(),然后重新组合找到的关键点并将它们平均分割并再次为compute()进行线程处理。我认为fps有所增加......再次检查后,速度是一样的。在互联网上搜索更多内容之后,我认为我无法以这种方式并行化detect()和compute()。如果有人知道原因,我希望你能告诉我。我要去尝试TBB。
我可能不需要像上面那样复制关键点,但如果你知道为什么,我仍然想知道,也许对于将来需要这样做的人。来自我的调试的更多信息,即使我初始化另一个提取器,即Ptr<ORB> extractor2 = ORB::create(...)
或使用相同的提取器,并从复制的关键点和原始提取器中提取描述符,并将描述符放入不同的描述符容器,我使用两个描述符匹配前一个图像中的一个。两场比赛都是正确的。