[英]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函数返回我的调用函数之后
所以我终于想通了。 诀窍是使用一个指针并初始化一个空的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.