- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我遇到了一个问题: CV::FlannBasedMatcher更准确地说,使用 knnMatch 方法。我的程序将 IplImage* 作为输入并检测人脸,然后切割人脸并将创建的人脸与我计算机上存储的图像进行比较。如果我得到超过 10 个良好匹配,它会写入标准输出匹配。
加载的图像不是灰度图像。这很重要吗?
我的问题是它可以工作,但时间是随机的,从 1 分钟到 3 分钟不等。
错误消息总是出现在 knnMatch 方法上。它们在这里(注意每次只有一个):
OpenCV Error: Assertion failed ((globalDescIdx>=0) && (globalDescIdx < size())) in getLocalIdx, file /opt/local/var/macports/build/_opt_mports_dports_graphics_opencv/opencv/work/opencv- 2.4.9/modules/features2d/src/matchers.cpp, line 163
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /opt/local/var/macports/build/_opt_mports_dports_graphics_opencv/opencv/work/opencv-2.4.9/modules/features2d/src/matchers.cpp:163: error: (-215) (globalDescIdx>=0) && (globalDescIdx < size()) in function getLocalIdx
我不明白为什么抛出这个异常...
这是我的代码:
int DroneCV::matchFaces()
{
std::vector<cv::KeyPoint> keypointsO;
std::vector<cv::KeyPoint> keypointsS;
cv::Mat descriptors_object, descriptors_scene;
cv::Mat foundFaces(this->_faceCut);
cv::FlannBasedMatcher matcher;
std::vector<std::vector<cv::DMatch>> matches;
std::vector<cv::DMatch> good_matches;
cv::SurfDescriptorExtractor extractor;
cv::SurfFeatureDetector surf(this->_minHessian);
surf.detect(foundFaces,keypointsS);
surf.detect(this->_faceToRecognize,keypointsO);
if (!this->_faceToRecognize.data || !foundFaces.data)
{
this->log("Fail to init data in DronceCV::matchFaces");
return (0);
}
extractor.compute(foundFaces, keypointsS, descriptors_scene);
extractor.compute(this->_faceToRecognize, keypointsO, descriptors_object);
if(descriptors_scene.empty())//descriptors_scene.type()!=CV_32F)
{
this->log("Descriptor got wrong type");
descriptors_scene.convertTo(descriptors_scene, CV_32F);
return 0;
}
if(descriptors_object.type()!=CV_32F || descriptors_scene.type()!=CV_32F)
{
this->log("TYPE OBJECT " + std::to_string(descriptors_object.type()));
this->log("TYPE SCENE " + std::to_string(descriptors_scene.type()));
return (0);
}
//Both image must be in grayscale ???
try {
matcher.knnMatch( descriptors_object, descriptors_scene, matches, 5 ); // find the 2 nearest neighbors
} catch (cv::Exception e) {
this->log(e.err);
}
good_matches.reserve(matches.size());
for (size_t i = 0; i < matches.size(); ++i)
{
if (matches[i].size() < 2)
continue;
const cv::DMatch &m1 = matches[i][0];
const cv::DMatch &m2 = matches[i][1];
if(m1.distance <= this->_nndrRatio * m2.distance)
good_matches.push_back(m1);
}
this->log("Number of good matches" + std::to_string(good_matches.size()));
foundFaces.release();
if (good_matches.size() > 8)
return (1);
else
return (0);
void DroneCV::analyzeFrame(IplImage *img)
{
if (!img)
{
this->log("Frame empty");
return;
}
if (this->detectFaces(img) == 1)
{
if (this->matchFaces() == 1)
{
this->log("Matched");
cvReleaseImage(&this->_faceCut);
}
}
}
预先感谢您的帮助
最佳答案
我也遇到了这个问题,我花了将近 3-4 个小时才弄明白。当您应用 knn match 时,请确保测试图像和查询图像中的特征数量大于或等于 knn 匹配中的最近邻居数量。
比如说,我们有这样的代码:
Mat img1,img2,desc1,desc2;
vector<KeyPoint> kpt1,kpt2;
FAST(img1,kpt1,30,true) ;
FAST(img2,kpt1,30,true) ;
SurfDescriptorExtractor sfdesc1,sfdesc2;
sfdesc1.compute(img1,kpt1,desc1);
sfdesc2.compute(img2,kpt2,desc2);
FlannBasedMatcher matcher;
vector< vector<DMatch> > matches1,matches2;
matcher.knnMatch(desc1,desc2,matches1,2);
这段代码会像文章中那样返回异常,只需修改代码如下:
if(kpt1.size()>=2 && kpt2.size()>=2)
matcher.knnMatch(desc1,desc2,matches1,2);
这个方法对我有用..!!
关于c++ - Opencv Flannbasedmatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25089393/
一旦我添加到我的代码中 FlannBasedMatcher matcher; 构建时出现以下错误 g++ -o "track" ./track.o -lopencv_imgproc -lopencv_
如果训练图像集很大,训练 OpenCV DescriptorMatcher 可能是一项耗时的操作。因此,将经过训练的 DescriptorMatcher 数据保存到磁盘以供以后重新加载似乎是一件非常明
我遇到了一个问题: CV::FlannBasedMatcher更准确地说,使用 knnMatch 方法。我的程序将 IplImage* 作为输入并检测人脸,然后切割人脸并将创建的人脸与我计算机上存储的
在 OpenCV 中使用 FlannBasedMatcher,调用具有相同参数的匹配器时我得到了不同的结果。谁能建议我做错了什么? 下面的代码显示了我遇到的问题的最小示例 - 它是我如何使用 Flan
十字邮寄here 我注意到函数 FlannBasedMatcher::match 有一个参数 mask,所以我尝试使用以下代码: #include #include "opencv2/core/cor
openCVs flannBasedMatcher 使用哪个距离函数,是否可以更改默认值?在 Muja 和 Lowe 的原始 flann 用户手册中,有一些不同的距离类型 (flann_distanc
我正在按照教程 (https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_matche
我想知道 openCV 中 BFMatcher 和 FlannBasedMatcher 在匹配精度或质量方面有何不同。我知道 FlannBasedMatcher 在应用于大型数据库时可能会更快,但是无
在 python 中,OpenCV 的 FlannBasedMatcher 构造函数采用参数字典,其中第一个是 algorithm。 The python tutorial建议可以通过传递不同命名的变
我正在尝试重写 here 中描述的代码.将 Python API 用于 Opencv。 代码的第 3 步有以下几行: FlannBasedMatcher matcher; std::vector
以下代码是用 C++ 编写的,我在实验中使用 OpenCV。假设我按以下方式使用 kd-tree (FlannBasedMatcher): //these are inputs to the code
我正在开发用于对象识别的乳房成像功能,使用 FlannBasedMatcher 计算空间直方图。 Mat ComputeSpatialHistogram(Mat features, Mat vocab
我正在尝试使用 OpenCV 的特征检测工具来确定小样本图像是否存在于较大的场景图像中。 我使用了 here 中的代码作为引用(没有单应部分)。 UIImage *sceneImage, *objec
我正在尝试使用 ORB 检测器/描述符和 Flann 或蛮力匹配器在更大的目标图像(allimg.jpg 包含 3 张面孔)中识别源图像(c1.jpg- 一张脸)。 c1.jpg 是通过裁剪/复制从
我正在尝试使用 SURF 和 kNN 对对象进行分类。该代码运行良好,但偶尔会崩溃并显示“段错误”。我不确定我是否做错了什么,但我很确定它已得到纠正。如果您想重现问题,这里是输入文件。 Link to
我想在 Python 中使用基于 flann 的匹配器,如 http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/p
我是一名优秀的程序员,十分优秀!