在 Mat 结构/列表中存储关键点和描述符

Posted

技术标签:

【中文标题】在 Mat 结构/列表中存储关键点和描述符【英文标题】:Store KeyPoints and descriptors in Mat structure/list 【发布时间】:2014-03-20 19:50:39 【问题描述】:

我想将几个图像的所有预先计算的关键点/描述符存储在一个 Mat 列表/结构或其他东西中,这样我以后就可以使用它们来将它们与其他图像描述符匹配。 你有想法吗?

显然有办法使用

List<Mat>

但我不知道怎么做。

【问题讨论】:

【参考方案1】:

您将一张图像的描述符存储在一个Mat 变量中。所以,基本上你有一个Mat 一个描述符。所以,如果你有 100 个描述符,那么所有这些描述符都应该出现在一个 Mat 中。你可以这样做:

第 1 步:声明 vectorMat 类型。

vector<Mat> allDescriptors;

Step-2:然后找到每张图片的描述符,并以Mat格式存储

Mat newImageDescriptor;

Step-3:最后,将上面计算的描述符推入向量中。

allDescriptors.push_back(newImageDescriptor);

对所有图片重复第 2 步和第 3 步

现在,您可以通过以下方式访问它们:

您可以像访问arrays 一样访问vector 中的数据

所以allDescriptors[0] 会给你Mat 格式的第一个描述符

因此,通过使用for loop,您可以访问所有描述符。

for(int i=0; i<allDescriptors.size(); i++)

    Mat accessedDescriptor;
    allDescriptors[i].copyTo(accessedDescriptor);

【讨论】:

我将更新我的答案...请稍等 我没有测试过代码,但逻辑是正确的,我以前用过,如果你有任何错误,请告诉我。 hello skm,我刚刚运行了我的代码,它运行良好,但是如何将 allDescriptors 存储在另一个 vector 中?我尝试了 copyTo,但遇到了异常。 我保留了另一个答案..看看它【参考方案2】:

如果您的元素存储在连续数组中,您可以将它们assign 一次添加到列表中:

#include <list>
std::list<Mat> l;
l.assign( ptr, ptr + sz); // where ptr is a pointer to array of Mat s
                          // and sz is the size of array

创建预先计算的元素:

Mat mat1;
Mat mat2;

以及这种类型的元素列表:

#include <list>
std::list<Mat> l;

将元素添加到列表中:

l.push_back( mat1);
l.push_back( mat2)

注意:还有其他修饰符可用于插入元素。你会发现他们的描述here。您可以考虑使用其他容器。选择合适的容器非常重要。您必须考虑对您至关重要的操作,这些操作将被最常调用。

【讨论】:

【参考方案3】:

这是关于您将vector&lt;Mat&gt; 复制到另一个vector&lt;Mat&gt; 的另一个问题

假设您有一个向量vector&lt;Mat&gt; des1,并且您想将其复制到vector&lt;Mat&gt; des2,那么您应该执行以下操作:

for(int i=0; i<des1.size(); i++)

    des1[i].copyTo(des2[i]);

请记住,vector&lt;Mat&gt; 类似于 Mat 的数组。那么,如何通过CopyTo 将一个向量复制到另一个向量,该向量用于复制一个矩阵。

【讨论】:

以上是关于在 Mat 结构/列表中存储关键点和描述符的主要内容,如果未能解决你的问题,请参考以下文章

通过将单个查询图像与多个图像的列表匹配来存储关键点索引

如何使用材料在同一行中制作图标和占位符?

mat-input 中的占位符位置

OpenCV+Python特征提取算法与图像描述符之SIFT / SURF / ORB

C# 中修饰符的基础结构和行为

C#关键字:访问修饰符