我正在进行一个OpenCV项目,尝试使用ORB特征检测器、BRISK特征描述符和暴力匹配器的组合来检测、匹配和跟踪由我的网络摄像头提供的视频序列中的特征。
目前,对于单个图像,一切都正常。我可以在屏幕上突出显示一个区域,将其作为ROI提取出来,检测其特征并将其与视频的第一帧进行匹配。然而,当我尝试在视频序列上计算此过程时,问题就出现了。
当我调用
这个问题是由于内存异常错误导致的,我认为匹配函数尝试使用的三个容器之一,主要是
目前,对于单个图像,一切都正常。我可以在屏幕上突出显示一个区域,将其作为ROI提取出来,检测其特征并将其与视频的第一帧进行匹配。然而,当我尝试在视频序列上计算此过程时,问题就出现了。
camera >> cameraFrame;
cv::cvtColor(cameraFrame, greyFrame, cv::COLOR_BGR2GRAY);
BriskMatching::briskMatcher.findFrameFeatures(greyFrame, mask);
BriskMatching::briskMatcher.computeFrameDescriptors(greyFrame);
if(BriskMatching::briskMatcher.getFirstFrame())
{
BriskMatching::briskMatcher.findImgFeatures(imgToMatch_1C);
BriskMatching::briskMatcher.setFirstFrame(false);
clearMask.copyTo(mask);
BriskMatching::briskMatcher.computeImgDescriptors(imgToMatch_1C);
}
}
BriskMatching::briskMatcher.match();
BriskMatching::briskMatcher.mMatches.clear();
cv::drawMatches(imgToMatch_1C, BriskMatching::briskMatcher.mImgORBFeatures, greyFrame, BriskMatching::briskMatcher.mFrameORBFeatures, BriskMatching::briskMatcher.mMatches, matchesImg, cv::Scalar(255, 255, 255));
cv::imshow("Matches", matchesImg);
当我调用
BriskMatching::briskMatcher.match();
时,程序在运行时崩溃,但仅限于程序循环的第一次迭代。下面是briskMatcher.match()
函数中包含的代码...void BriskMatching::match()
{
mBfMatcher.match(mImgDescriptors,mFrameDescriptors, mMatches);
}
这个问题是由于内存异常错误导致的,我认为匹配函数尝试使用的三个容器之一,主要是
mMatches
,它是一个std::vector<cv::KeyPoint>
,可能存在问题。在再次使用向量之前,我尝试通过调用mMatches.clear();
来清除向量,虽然向量被清除了,但仍然会在运行时崩溃。
有没有人对我的崩溃原因有任何见解或建议?我已经试了很长时间了,这让我非常沮丧。