将一行cv::Mat转换为int

6
我有一个来自FREAK描述提取的描述符矩阵,其中每一行都是由64个元素组成的描述符。
由于系统要求,我需要从这个矩阵中创建一个向量。到目前为止,我尝试了以下方法:
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 );
}

这是否正确,或者有更好的方法?

2个回答

4

这段代码中的descriptors所有值都将指向堆栈上的变量row

查看opencv Mat的定义,row返回的是一个值:

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

直接访问_descriptors中的数据,并使用提供的步长成员变量step进行步进应该可以实现:

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

1
无论如何,您的代码都无法编译,我将static_cast<>更改为(int*)。 - Jav_Rock

0

当您为向量描述符创建新对象时,您正在创建一个具有变量地址而不是其实际值的对象。如果要存储该值,则代码应如下所示。

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


好的,这不是我想要的,我需要一个vector<int*>,因为另一个函数需要它,而且我不能改变它。 - Jav_Rock
好的,你应该使用 vector<int*> descriptors,在创建对象时只需调用 descriptors.push_back( new int(row) ); - Tiago Salzmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接