2012-06-19 35 views
5
Bu kodu kullanarak başka görüntüde tanımlanmış bir nesneyi algılamak için Windows 7'de OpenCV2.2 Ne yapmaya çalışıyorum olduğunu kullanıyorum

Başarısız FlannBased:Maçlar Onaylama Hata

// Read the two image files 
Mat image1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE); 
Mat image2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE); 

Mat finalImage = imread(argv[2]); 

if(!image1.data || !image2.data) { 
    std::cout << " --(!) Error reading images " << std::endl; 
    return -10; 
} 

//Construct the SURF Detector 
int minHessian = 400; 
SurfFeatureDetector detector(minHessian); 

//Extract the keypoints for each image 
std::vector<KeyPoint> keypoints1, keypoints2; 
detector.detect(image1,keypoints1); 
detector.detect(image2,keypoints2); 


//Calculate descriptors (feature vectors) 
SurfDescriptorExtractor extractor; 
Mat descriptors1, descriptors2; 
extractor.compute(image1,keypoints1,descriptors1); 
extractor.compute(image2,keypoints2,descriptors2); 

//Define the Matcher 
FlannBasedMatcher matcher; 

std::cout << "matcher constructed!" << std::endl; 

std::vector<vector<DMatch >> matches; 
matcher.knnMatch(descriptors1, descriptors2, matches, 2); 

std::cout << "matches: " << matches.size() << std::endl; 

std::vector<DMatch > good_matches; 

    //THIS LOOP IS SENSITIVE TO SEGFAULTS 
for (int i = 0; i < min(descriptors2.rows-1,(int) matches.size()); i++) 
    { 
     if((matches[i][0].distance < 0.8*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0)) 
     { 
      good_matches.push_back(matches[i][0]); 
     } 
    } 

std::cout << "good_matches: " << good_matches.size() << std::endl; 

VS2010 oluşturur ve kod derler hatasız. Benim sorunum yürütme hattı

matcher.knnMatch(descriptors1, descriptors2, matches, 2);

cmd durur gider ve benzeri bir mesaj döndürür bazı (ve hepsi değil) durumlarda, yani: "onaylama işlemi başarısız (dataset.Type() == CvType(T)::type()) bilinmeyen işlevinde vs. vs. flann.hpp satırına sonlandırma 105 "

Bu, resimler arasında hiçbir benzerlik olmadığında (eşleşme için gerekli) tanımlayıcıların her iki görüntüden doğru şekilde çıkarılmasına rağmen gerçekleşir. BruteForce eşleştiricisi kullanırsam kod çalışır.

Ben de OpenCV kodu denedim:

http://opencv.itseez.com/doc/tutorials/features2d/feature_homography/feature_homography.html

ve aynı sorunu vardı. Opencv örneğindeki gibi basit eşleştirici kullansam bile yürütme başarısız olur.

std::vector<DMatch> matches;

matcher.match(descriptors_object, descriptors_scene, matches);

Ben çözüm için (OpenCV flann.h assertion Error bulunan benzer bir soru ama ne yazık ki hiçbir cevap) arandı ama yararlı bir şey bulamadık. Bu sorunun üstesinden gelmeyi bilen var mı? garip

+0

Sorununuzu çözüp çözemeyeceğinden emin değilim, ancak tanımlayıcıları CV_32F türüne dönüştürmeyi denerseniz. – andriy

+0

tanımlayıcıları boş denetle. if (! descriptors.empty()) {// bazı flanşlı bebekler yapın} – madLokesh

+0

ayrıca tanımlayıcıları CV_32F formatına değiştirin – madLokesh

cevap

0

, bu

Belki cv :: DescriptorMatcher arabirimini (docs here) kullanmayı deneyebilirsiniz ... this tutorial page aynı kod dikişleri.

cv::DescriptorMatcher matcher = cv::DescriptorMatcher::create("FlannBased"); 

Ve sonra herhangi bir değişiklik olmadan, kodunuzu düz kullanabilirsiniz:

kullanımıdır.

İlgili konular