我正在尝试使用 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函数返回描述符变量是我所期望的。它已被初始化并包含我想要的数据。但是,当DescriptorExtractor::compute方法返回时,新的描述符结构不会传递回我的主代码,即使它是按引用传递的方法。
这可能是什么原因造成的?
编辑2:
这是我在调试期间观察变量的一些屏幕截图。
函数返回之前的 .compute 函数中的描述符 Mat
就在 .compute 函数返回到我的调用函数之后