OpenCV的Brute Force Matcher在第二次迭代时崩溃
OpenCV's Brute Force Matcher crashes on second iteration
我正在进行一个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();
来清除矢量,尽管矢量已被清除,但我在运行时仍然会崩溃。
有人对可能导致我崩溃的原因有任何见解或建议吗?我已经搞了一段时间了,它开始变得很令人沮丧。
我试着和你做同样的事情,我有一个程序,里面有很多检测器、提取器和匹配算法,我遇到了和你一样的问题。
在我的案例中,如果我使用Knn Matcher或FLANN Matcher,我决定使用ORB检测器和SIFT提取器方法,它可以正常工作,但当我用这种方法实现BFMatcher时,我做不到。最后,我决定将ORB提取器与BFMatcher一起使用,它可以工作。
我的代码是这样的:
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]);
}
}
}
如果你想使用提取器SIFT方法,我建议你使用我做过的其他匹配器算法,但是如果你喜欢,你可以对我做同样的事情(取决于匹配方法,使用一个或其他提取器),你会比较结果。
- 在一次迭代中从 txt 文件中读取多行
- 高级选择排序 - 在一次迭代中搜索两个元素
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- foor 循环的最后一次迭代中的指针更改
- 虽然循环只做 1 次迭代
- GetDIBits 在屏幕捕获函数中多次迭代后返回零
- 是什么导致我的循环在第一次迭代中运行得更慢
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 为什么第一次迭代后的指针指向随机值?
- cin语句在循环的第三次迭代中被跳过
- ifstream不会在下一次迭代中打开文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 在我的switch语句完全执行之前,我的while循环进入第二次迭代,我用c ++编码
- 为什么第二次迭代大量字节的速度要慢得多?以及如何解决它
- 矢量插入分段错误第二次迭代
- 第二次迭代崩溃顺序无关
- OpenCV的Brute Force Matcher在第二次迭代时崩溃
- 指针在第二次迭代后不再工作
- 在C++中打开文件 - getline 在第二次迭代时失败