【发布时间】:2014-03-20 19:50:39
【问题描述】:
我想将几个图像的所有预先计算的关键点/描述符存储在一个 Mat 列表/结构或其他东西中,这样我以后就可以使用它们来将它们与其他图像描述符匹配。 你有想法吗?
显然有办法使用
List<Mat>
但我不知道怎么做。
【问题讨论】:
标签: c++ opencv image-processing mat
我想将几个图像的所有预先计算的关键点/描述符存储在一个 Mat 列表/结构或其他东西中,这样我以后就可以使用它们来将它们与其他图像描述符匹配。 你有想法吗?
显然有办法使用
List<Mat>
但我不知道怎么做。
【问题讨论】:
标签: c++ opencv image-processing mat
您将一张图像的描述符存储在一个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);
}
【讨论】:
如果您的元素存储在连续数组中,您可以将它们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。您可以考虑使用其他容器。选择合适的容器非常重要。您必须考虑对您至关重要的操作,这些操作将被最常调用。
【讨论】:
这是关于您将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 将一个向量复制到另一个向量,该向量用于复制一个矩阵。
【讨论】: