OpenCV不生成描述符

时间:2014-05-26 13:09:59

标签: c++ opencv image-processing keypoint

我正在尝试使用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);

然而,在运行&#34; compute&#34;之后,描述符Mat总是空的。功能。所有的指针都只是NULL,虽然我可以清楚地看到keyPoints数组在运行之后是一个缩小的大小。这意味着它正在删除它无法提取描述符的关键点。

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

其他人是否有问题,或者我错过了OpenCV的基本内容?

编辑:

所以我进一步追查了这个问题。看来,按引用传递并不会改变原始的cv :: Mat数据结构。

compute函数的函数声明如下:

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

computeImpl是实际计算描述符的函数。就我而言,简介描述符。

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

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

可能导致这种情况的原因是什么?

编辑2:

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

在函数返回之前,.compute函数内的描述符匹配 The descriptors Mat inside the .compute function just before the function returns

.compute函数返回我的调用函数之后 Just after the .compute function returns into my calling function

1 个答案:

答案 0 :(得分:0)

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

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

我改变了:

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

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

现在一切都很完美。

相关问题