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?
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
kiểm tra xem có mô tả trống không. if (! descriptors.empty()) {// làm một số flann baby} – madLokesh
cũng thay đổi các descriptor thành định dạng CV_32F – madLokesh