我有一个来自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 );
}
这是正确的还是有更好的方法?
descriptors
中的所有值都指向堆栈上的变量row
。
查看opencv Mat
的定义,row
按值返回:
// 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));
}
当您为矢量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*> descriptors
更改为vector<int> descriptors
。