У меня проблема с:
резюме :: FlannBasedMatcher
Точнее с помощью метода knnMatch.
Моя программа принимает в качестве входных данных и IplImage * и обнаруживает лицо, затем обрезает лица и сравнивает найденное лицо с изображением, хранящимся на моем компьютере. Если я получил более 10 хороших совпадений, он пишет на стандартный выход Matched.
Загруженные изображения не являются оттенками серого. Это важно?
Моя проблема в том, что это работает, но в течение случайного количества времени, которое варьируется от 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, убедитесь, что количество объектов в тестовом изображении и в изображении запроса больше или равно количеству ближайших соседей в совпадении 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);
этот метод работал для меня .. !!