【问题标题】:how to make same size descriptors for all images如何为所有图像制作相同大小的描述符
【发布时间】:2013-08-27 22:07:26
【问题描述】:

谁能告诉我如何使描述符的大小固定?因为我们可能会从不同的图像中得到不同数量的描述符 For example 如果我有 450*550 的图像并且我在其上应用了 surf 特征,则 surf 从中提取关键点,然后从中提取描述符,例如,它从 450*550 image 中提取关键点的 10 descriptors,然后再次读取一个图像及其大小为 750*880,因此 surf 从中提取关键点而不是描述符,例如这次它从该图像中提取20 descriptors,现在我想做的是,无论图像的大小如何,我都想要,描述符的大小应该相同,就像它应该从两个图像中获取 10 个描述符,所以在许多图像的情况下,它应该选择描述符的最小大小并从所有图像中仅提取该描述符并保留其他描述符,或者我定义大小它会忽略描述符低于或高于该尺寸的图像

extractor.compute( tmplate_img, keypoints, descriptors);
my_img=descriptors.reshape(1,1);

当我通过循环运行它时,我想为所有图像制作相同大小的描述符,并且描述符的大小更适合获得更好的结果,描述符是 MAT。

谢谢

【问题讨论】:

  • 您使用的是哪个检测器和描述符?
  • @GiLevi Sift 和 Surf 都
  • 这是一个非常糟糕的问题。你需要首先描述你做了什么,你正在使用什么 OpenCV 函数/类,以及你想要以简洁的方式实现什么。不要假设其他人正在研究完全相同的问题。写问题时要考虑读者。
  • @Bee 我努力让它变得更好

标签: c++ opencv computer-vision svm surf


【解决方案1】:

您可以使用以下代码保留响应最大的前 M 个关键点:

bool compareFunction(KeyPoint p1, KeyPoint p2) {return p1.response>p2.response;}
//The function retains the stongest M keypoints in kp
void RetainBestKeypoints(vector<KeyPoint>  &kp, int M)
{
    vector<KeyPoint>  sortedkp;

    sort(kp.begin(),kp.end(),compareFunction);
    if (kp.size()>M)
            kp.erase(kp.begin()+M,kp.end());
}

【讨论】:

  • 我想保持所有图像的描述符大小相同并保存所有图像的大小,我不希望一张图像有 10 个描述符,第二个有 15 个描述符,还有 20 个对于第三个等等,我希望所有图像的描述符具有相同的大小,如果我得到固定大小的最大/最大描述符,例如 30,并且我得到所有其他图像的描述符最大为 20,所以它会提高相同问题
  • 你的意思是描述符向量的维度吗?我不确定你的意思。
  • 我想我理解了你的问题。假设您想要每个图像中的 10 个描述符。从图像中提取超过 10 个关键点,但使用我上面粘贴的代码只保留前 10 个,然后提取这些关键点的描述符。
  • 请问您为什么将两个关键点作为参数?在比较函数中?
  • 我根据他们的反应比较他们。我将 M 关键点保留最大响应,并丢弃所有其他关键点。
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2014-05-24
  • 2019-03-25
相关资源
最近更新 更多