2013-05-23 7 views
4

Я хочу создать классификатор, чтобы идентифицировать насекомое его захваченное изображение. Впервые я использовал HuMomemnts, но изображения, снятые в разных разрешениях, дали неверные результаты, поскольку HuMoments - это масштабный вариант. После нескольких поисков в Интернете я обнаружил, что использование SIFT и SURF может решить мою проблему, и поэтому я попытался понять, что происходит, когда я использую SIFT. Первые два изображения ниже относятся к разным типам насекомых. Результаты были странными, поскольку все функции из 400 были сопоставлены (см. 3-е изображение).OpenCV, SIFT: все функции двух разных насекомых соответствуют

enter image description here enter image description here enter image description here

int main() 
{ 
Mat src = imread(firstInsect); 
Mat src2 = imread("secondInsect"); 

if(src.empty() || src2.empty()) 
{ 
    printf("Can not read one of the image\n"); 
    return -1; 
} 

//Detect key point in the image 
SiftFeatureDetector detector(400); 
vector<KeyPoint> keypoints; 
detector.detect(src, keypoints); 

//cout << keypoints.size() << " of keypoints are found" << endl; 

cv::FileStorage fs(firstInsectXML, FileStorage::WRITE); 
detector.write(fs); 
fs.release(); 


SiftFeatureDetector detector2(400); 
vector<KeyPoint> keypoints2; 
detector.detect(src2, keypoints2); 

cv::FileStorage fs2(secondInsectXML, FileStorage::WRITE); 
detector.write(fs2); 
fs2.release(); 


//Compute the SIFT feature descriptors for the keypoints 
//Multiple features can be extracted from a single keypoint, so the result is a 
//matrix where row "i" is the list of features for keypoint "i" 

SiftDescriptorExtractor extractor; 
Mat descriptors; 
extractor.compute(src, keypoints, descriptors); 

SiftDescriptorExtractor extractor2; 
Mat descriptors2; 
extractor.compute(src2, keypoints2, descriptors2); 


//Print some statistics on the matrices returned 
//Size size = descriptors.size(); 
//cout<<"Query descriptors height: "<<size.height<< " width: "<<size.width<< " area: "<<size.area() << " non-zero: "<<countNonZero(descriptors)<<endl; 



//saveKeypoints(keypoints, detector); 


Mat output; 
drawKeypoints(src, keypoints, output, Scalar(0, 0, 255), DrawMatchesFlags::DEFAULT); 
imwrite(firstInsectPicture, output); 

Mat output2; 
drawKeypoints(src2, keypoints2, output2, Scalar(0, 0, 255), DrawMatchesFlags::DEFAULT); 
imwrite(secondInsectPicture, output2); 


//Corresponded points 
BFMatcher matcher(NORM_L2); 
vector<DMatch> matches; 
matcher.match(descriptors, descriptors2, matches); 

cout<< "Number of matches: "<<matches.size()<<endl; 

Mat img_matches; 
drawMatches(src, keypoints, src2, keypoints2, matches, img_matches); 
imwrite(resultPicture, img_matches); 

system("PAUSE"); 
waitKey(10000); 

return 0;} 

Вопрос 1: Почему все функции имеют соответствие в этих двух изображений?

Вопрос 2: Как я могу сохранить (например, файл XML) изображения изображения таким образом, чтобы эти функции могли быть сохранены для обучения в дереве классификации (например, в случайном дереве)?

ответ

2

SIFT essential занимает учебное изображение и извлекает достопримечательности. Эти точки фильтруются, а низкие контрастные точки отбрасываются. Высокие контрастные точки после некоторых вычислений используются для описания объекта или сцены. Эти, по существу, ROI можно использовать для идентификации похожих патчей, даже если меняется однородная шкала, ориентация и т. Д.

У нас есть несколько проблем здесь. Во-первых, вы используете SIFT для нежесткой регистрации поверхности. Это означает, что вы пытаетесь классифицировать различные ошибки (внутригрупповые) по своим общим функциям, но на самом деле для этой цели он никогда не использовался. Кроме того, ошибки на самом деле совсем разные и, похоже, имеют мало общего. Во-вторых, вы используете SIFT с очень низким качеством входного источника (точки низкого качества), который по существу является только двоичной маской.

Если вы экспериментируете с различными методами регистрации объектов, то, вероятно, полезно сначала использовать well known and widely used toy dataset, поскольку это упрощает вашу проблему и позволяет вам видеть, что работает на простых случаях, а что нет, после чего вы возвращаетесь к ваш реальный набор данных.

Есть много интересных методов, которые выглядят более suitable для регистрации в группе.

1

Вы можете использовать Shape Context, учитывая, что у вас есть двоичные изображения с довольно четкими границами.

 Смежные вопросы

  • Нет связанных вопросов^_^