在 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 步:声明 vector
的 Mat
类型。
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如果您的元素存储在连续数组中,您可以将它们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<Mat>
复制到另一个vector<Mat>
的另一个问题
假设您有一个向量vector<Mat> des1
,并且您想将其复制到vector<Mat> des2
,那么您应该执行以下操作:
for(int i=0; i<des1.size(); i++)
des1[i].copyTo(des2[i]);
请记住,vector<Mat>
类似于 Mat
的数组。那么,如何通过CopyTo
将一个向量复制到另一个向量,该向量用于复制一个矩阵。
【讨论】:
以上是关于在 Mat 结构/列表中存储关键点和描述符的主要内容,如果未能解决你的问题,请参考以下文章