将一行cv::Mat转换为int类型

Convert a row of cv::Mat to an int

本文关键字:Mat 转换 int 类型 cv 一行      更新时间:2023-10-16

我有一个来自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