我正在开发一个OpenCV项目,我试图使用ORB特征检测器,BRISK特征描述符和Brute Force Matcher的组合来通过我的网络摄像头提供的视频序列来检测,匹配和跟踪功能。
目前,单张图片的一切正常。我可以突出显示屏幕上的某个区域,将其作为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();
来清除向量,虽然向量已被清除,但我仍然在运行时遇到崩溃。
是否有人对可能导致崩溃的原因有任何见解或建议。我已经搞砸了一段时间了,而且开始变得非常令人沮丧。谢谢你提前。
答案 0 :(得分:0)
我试着和你做同样的事情,我有一个带有很多探测器,提取器和匹配算法的程序,我遇到了和你一样的问题。
在我的情况下,我决定使用ORB检测器和SIFT提取器方法,如果我使用Knn-Matcher或FLANN-Matcher并且它工作正常,但是当我用这种方法实现BFMatcher时我无法做到。最后我决定使用带有BFMatcher的ORB提取器,它可以工作。
我的代码是这样的:
else if(botonORBisPressed){
OrbFeatureDetector detector;
for (int i=0; i<2; i++) {
detector.detect(gray_image[i], keypoints[i]);
}
//Extractor method depends on Matcher.
if (botonBFPulsado == true) {
Ptr <DescriptorExtractor> extractor = DescriptorExtractor::create("ORB");
if(!extractor)
{
cout << "Error creating feature descriptor" << endl;
getchar();
}
for (int i=0; i<2; i++) {
(* extractor).compute( gray_image[i], keypoints[i], descriptors[i] );
}
}
if ((botonFlannisPressed == true) || (botonKnnisPressed == true)) {
//Use SIFT algorithm to do the matching
SiftDescriptorExtractor extractor;
for (int i=0 ; i<2 ; i++) {
extractor.compute(gray_image[i], keypoints[i],descriptors[i]);
}
}
}
如果你想使用extractor-SIFT方法,我建议你使用其他matcher算法,但是如果你愿意,你可以对我这样做(取决于匹配方法使用一个或其他提取器),你会比较结果。