2012-06-19 19 views
5

Tôi đang sử dụng OpenCV2.2 trong Windows 7. Những gì tôi đang cố gắng để làm là để phát hiện một đối tượng quy định tại hình ảnh khác sử dụng mã này:FlannBased Matcher Assertion Không Lỗi

// 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 xây dựng và biên dịch mã không có lỗi. Vấn đề của tôi là trong một số (chứ không phải tất cả) các trường hợp, khi thực hiện đi vào dòng

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

các điểm dừng cmd và trả về một thông báo như: "Assertion Không thành công (dataset.Type() == CvType(T)::type()) trong chức năng chưa biết vv vv Kết thúc với dòng flann.hpp 105 "

Điều này diễn ra khi không có sự giống nhau giữa hình ảnh (và không phải cho tất cả các trường hợp), mặc dù mô tả (cần thiết cho phù hợp) được trích xuất chính xác từ cả hai hình ảnh. Mã hoạt động tốt nếu tôi sử dụng BruteForce matcher.

Tôi cũng đã thử các mã từ OpenCV:

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

và có cùng một vấn đề. Việc thực hiện không thành công ngay cả khi tôi sử dụng trình kết hợp đơn giản như trong mẫu Opencv.

std::vector<DMatch> matches;

matcher.match(descriptors_object, descriptors_scene, matches);

tôi tìm kiếm giải pháp (một câu hỏi tương tự tìm thấy tại OpenCV flann.h assertion Error nhưng tiếc là không có câu trả lời) nhưng tôi đã không tìm thấy bất cứ điều gì hữu ích. Có ai biết cách giải quyết vấn đề này không?

+0

Tôi không chắc liệu nó có giải quyết được vấn đề của bạn hay không, nhưng điều gì sẽ xảy ra nếu bạn cố chuyển đổi các bộ mô tả thành loại CV_32F. – andriy

+0

kiểm tra xem có mô tả trống không. if (! descriptors.empty()) {// làm một số flann baby} – madLokesh

+0

cũng thay đổi các descriptor thành định dạng CV_32F – madLokesh

Trả lời

0

Đó là lạ, nó seams cùng mã trong this tutorial page ...

Có lẽ bạn có thể thử sử dụng giao diện cv :: DescriptorMatcher (docs here).

Việc sử dụng là:

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

Và sau đó bạn có thể sử dụng nó thẳng với mã của bạn mà không cần bất kỳ thay đổi.

Các vấn đề liên quan