我知道至少有十几个valgrind reports invalid read
问题,但请耐心等待,因为我真的不知道如何帮助自己,所以我问你的。
我正在为 OpenCV 特征检测和特征描述模块编写一个包装器(我希望能够在某个时候实现我自己的特征检测/提取)。因此,我不能直接对 OpenCV 数据类型进行操作。
因此,当从特征中提取描述符时,我将它们存储为std::vector <std::vector <double> >
而不是cv::Mat
. 我有这段代码,我首先计算描述符,然后将它们从一种表示法转换为另一种表示法:
// private
void CVDescriptor::calculateDescriptors(std::vector <cv::KeyPoint> &feats){
this->feats = &feats;
this->descCalc->compute(*(this->image), feats, this->desc);
this->calculated = true;
}
// public
void CVDescriptor::calculateDescriptors
(std::vector< std::vector< double > >& desc,
std::vector< cv::KeyPoint >& feats){
if (!this->calculated)
this->calculateDescriptors(feats);
assert(this->calculated);
const double *temp;
desc.clear();
desc.reserve(this->desc.rows);
for (int i=0, szi = this->desc.rows; i < szi; ++i){
temp = this->desc.ptr<double>(i);
// this line is the problem
desc.push_back(std::vector<double>(temp, temp+(this->desc.cols)));
// .
// /|\
// |
}
assert(desc.size() == this->desc.rows);
assert(desc[0].size() == this->desc.cols);
return;
}
以下是我的成员变量的类型,我已经检查并写入了初始化它们的位置(只是为了避免混淆):
std::vector <cv::KeyPoint> *feats
cv::Mat *image;
// it is set just before calling calculateDescriptors(desc, feats)
cv::Mat desc;
bool calculated; // set in the only constructor
这是cv::DescriptorExtractor::compute
. 据我所见,每个计算的描述符应该是 中的一行cv::Mat
,并且应该具有与矩阵的列一样多的组件。
我怀疑我的代码中某些地方存在内存泄漏,所以我通过Valgrind运行它。它报告的第一件事是Invalid read of size 1
在我的代码摘录中标有大箭头的行上。据我所见,每次调用它只报告两次CVDescriptor::calculateDescriptors(..)
,而不是在for loop
.
任何人都可以看到我的复制代码有任何明显错误吗?或者有任何其他想法如何发生?
如果需要,我可以提供其他信息,但我尝试将所有相关代码放在这里(因为我的项目很大)。提前谢谢大家(我很抱歉这个冗长的问题)......