在Mat结构/列表中存储KeyPoints和描述符

时间:2014-03-20 19:50:39

标签: c++ opencv image-processing mat

我想将所有我预先计算好的几个图像的关键点/描述符存储在Mat列表/结构中,所以我以后可以使用它们将它们与其他图像描述符进行匹配。 你有好主意吗?

显然,有一种方法可以使用

List<Mat>

但我不知道如何。

3 个答案:

答案 0 :(得分:0)

如果您的元素存储在连续数组中,您可以使用以下内容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。您可以考虑使用其他容器。选择合适的容器非常重要。您必须考虑对您来说至关重要的操作,这些操作最常被调用。

答案 1 :(得分:0)

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

第1步:声明vector Mat类型。

vector<Mat> allDescriptors;

步骤2:然后查找每个图片的描述符并以Mat格式存储

Mat newImageDescriptor;

步骤3:最后,将上面计算的描述符推送到向量中。

allDescriptors.push_back(newImageDescriptor);

重复步骤2&amp; 3适用于所有图像

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

如果vector

,您可以访问arrays中的数据

所以allDescriptors[0]会以Mat格式

为您提供第一个描述符

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

for(int i=0; i<allDescriptors.size(); i++)
{
    Mat accessedDescriptor;
    allDescriptors[i].copyTo(accessedDescriptor);
}

答案 2 :(得分:0)

这是关于您将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的arrya。那么,如何通过CopyTo将矢量复制到另一个矢量,用于复制矩阵。