繁体   English   中英

OpenCV不生成描述符

[英]OpenCV not generating descriptors

我正在尝试使用OpenCV在iOS上图像的关键点生成描述符。 我已经使用自己的算法完成了特征检测,现在想在这些点上提取描述符。

我实现了以下代码来做到这一点:

cv::Mat frame = LH_ImageProcessing::extractGrayFromBGRA(Img, 480, 640);
std::vector<cv::KeyPoint> keyPoints;
cv::Mat descriptors;

for (int i = 0; i < cornersDetected; i++) {
  keyPoints.push_back(cv::KeyPoint((float) cornerArray[i*2], (float) cornerArray[i*2+1], 5));
}

cv::BriefDescriptorExtractor extractor;
extractor.compute(frame, keyPoints, descriptors);

但是,在运行“计算”函数后,描述符Mat始终为空。 尽管我可以清楚地看到keyPoints数组在运行后减小了大小,但所有指针都为NULL。 这意味着它将删除无法为其提取描述符的关键点。

我以为这是我的实现,因此我使用了内置检测器(SurfDetector)并从OpenCV FREAK示例中复制了实现。 但是我最终得到了相同的结果。

还有其他人遇到问题吗,还是我错过了OpenCV的一些基本知识?

编辑:

因此,我进一步追踪了这个问题。 似乎按引用传递不会更改原始cv :: Mat数据结构。

计算函数的函数声明如下所示:

void DescriptorExtractor::compute( const Mat& image, std::vector<KeyPoint>& keypoints, Mat& descriptors ) const 
{
....
computeImpl( image, keypoints, descriptors );
}

computeImpl是实际计算描述符的函数。 在我的情况下,BRIEF描述符。

void BriefDescriptorExtractor::computeImpl(const Mat& image, std::vector<KeyPoint>& keypoints, Mat& descriptors) const

computeImpl函数返回的描述符变量是我所期望的。 它已被初始化并包含我想要的数据。 但是,当DescriptorExtractor :: compute方法返回新的描述符结构时,即使它是通过引用传递的方法,也不会传递回我的主代码。

是什么原因造成的?

编辑2:

这是调试期间我的监视变量的一些屏幕截图。

函数返回之前,.compute函数中的描述符Mat 函数返回之前,.compute函数中的描述符Mat

就在.compute函数返回我的调用函数之后 就在.compute函数返回我的调用函数之后

所以我终于想通了。 诀窍是使用一个指针并初始化一个空的cv :: Mat,然后将此指针传递给计算函数。 然后,OpenCV在.compute函数中将其重新初始化,当一切返回时,指针指向新的数据结构。

看来问题出在编译器优化空cv :: Mat的创建,因此当计算返回时,内存就被释放了。

我变了:

cv::Mat descriptors;
...
ext.compute(frame, keyPoints, descriptors);

cv::Mat *descriptors = new cv::Mat;
...
ext.compute(frame, keyPoints, *descriptors);

现在一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM