【问题标题】:OpenCV not generating descriptorsOpenCV 不生成描述符
【发布时间】:2014-07-15 06:36:37
【问题描述】:

我正在尝试使用 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 始终为空。所有的指针都只是 NULL,虽然我可以清楚地看到 keyPoints 数组在我运行后减小了大小。这意味着它正在删除无法提取描述符的关键点。

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

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

编辑:

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

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

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 函数返回 descriptors 变量是我所期望的。它已被初始化并包含我想要的数据。但是,当 DescriptorExtractor::compute 方法返回时,新的描述符结构不会传递回我的主代码,即使它是按引用传递的方法。

这可能是什么原因造成的?

编辑 2:

这是我在调试过程中观察变量的一些屏幕截图。

.compute 函数内的描述符 Mat 就在函数返回之前

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

【问题讨论】:

  • 您是在 .compute 之后立即检查 dscriptors 还是将您的代码封装在另一个函数中?
  • 我的代码显示在顶部。我在 .compute 之后立即设置了一个断点并在那里进行了检查。整个 cv::Mat 结构只是充满了 NULL 指针,就像我最初定义它之后一样。
  • 发表评论或批评,而不仅仅是投反对票。我认为这个问题没有任何意义。
  • 抱歉,无法在 iOS 上测试...“所有指针都为 NULL”是什么意思?哪些指针?
  • 查看我添加到帖子中的 2 个屏幕截图。第二个应该与第一个相同,因为它是通过引用传递的。

标签: c++ opencv image-processing keypoint


【解决方案1】:

所以我终于想通了。诀窍是使用指针并初始化一个空的 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);

现在一切正常。

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 2010-10-27
    • 2016-02-10
    • 2018-06-28
    • 1970-01-01
    • 2017-03-21
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多