6

我有一个来自 FREAK 描述提取的描述符矩阵,其中每一行是 64 个元素的描述符。

由于系统要求,我需要vector <int*>从此矩阵创建一个。到目前为止我试过这个:

Mat _descriptors;
std::vector<int*> descriptors;
int row;
for (int i=0; i<_descriptors.rows;i++)
{
    row =(int) _descriptors.row(i).data;
    descriptors.push_back( & row );
}

这是正确的还是有更好的方法?

4

2 回答 2

4

中的所有值都descriptors将指向row带有此代码的堆栈上的变量。

查看 opencv 的定义Matrow按值返回:

// returns a new matrix header for the specified row
Mat row(int y) const;

但是,直接访问数据_descriptors并使用提供的 stride 成员变量step应该可以工作:

Mat _descriptors;
std::vector<int*> descriptors;
for (int i=0; i<_descriptors.rows;i++)
{
    descriptors.push_back((int*)(_descriptors.data + i * _descriptors.step));
}
于 2013-01-11T12:15:28.530 回答
0

当您为 vector 创建一个新对象时descriptors,您正在创建一个带有row变量地址而不是实际值的对象。要存储该值,如果这是您想要的,代码应如下所示。

Mat _descriptors;
std::vector<int> descriptors;
int row;
for (int i=0; i<_descriptors.rows;i++)
{
    row =(int) _descriptors.row(i).data;
    descriptors.push_back( row );
}

我也将其更改vector<int*> descriptorsvector<int> descriptors.

于 2013-01-11T12:13:49.880 回答