1

Как использовать методы findhomography() и perspectiveTransform() в случае, когда у вас есть ключевые точки, полученные из поезда изображений.Гомография для набора обучающих кадров

нижеследующий - мой код.

cv::BruteForceMatcher<cv::HammingLUT > descriptormatcher; 
descriptormatcher.add(addtraindesc); 
descriptormatcher.train(); 
descriptormatcher.match(descriptor1,matches1); 
//calculate min and max distance between keypoints 
double max_dist = 0; 
double min_dist = 100; 
for (int i_desc=0; i_desc< descriptor1.rows;i_desc++) 
{ 
    double dist=matches1[i_desc].distance; 
    if(dist < min_dist) min_dist = dist; 
    if(dist > max_dist) max_dist = dist; 
} 
//Get only good matches 
vector<DMatch> goodmatches; 
for (int i_desc=0; i_desc< descriptor1.rows;i_desc++) 
    { 
     double good_dist=3*min_dist ; 
    if(matches1[i_desc].distance < good_dist) 
     { goodmatches.push_back(matches1[i_desc]); } 
    } 
// calculate object and scene points 
std::vector<Point2f> obj; 
std::vector<Point2f> scene; 
vector<vector<KeyPoint> > newtrainkeypoints=gettrainkeypoints(); 
for(int i_gm=0; i_gm<goodmatches.size(); i_gm++) 
{ 
    DMatch imatch = goodmatches[i_gm]; 
    obj.push_back(newtrainkeypoints[imatch.imgIdx][imatch.trainIdx].pt); 
    scene.push_back(v1[imatch.queryIdx].pt); 
} 
Mat H = findHomography(obj, scene, CV_RANSAC); 
std::vector<Point2f> obj_corners(4); 
// how to calculate the obj_corners for array of images from training set 
std::vector<Point2f> scene_corners(4); 
    perspectiveTransform(obj_corners, scene_corners, H); 
    line(mRgb1, scene_corners[0], scene_corners[1], Scalar(0, 255, 0), 4); 
    line(mRgb1, scene_corners[1], scene_corners[2], Scalar(0, 255, 0), 4); 
    line(mRgb1, scene_corners[2], scene_corners[3], Scalar(0, 255, 0), 4); 
    line(mRgb1, scene_corners[3], scene_corners[0], Scalar(0, 255, 0), 4); 

Один быстрое грязное решение было бы поместить всю эту часть кода в forloop для всех изображений в обучающем наборе и выполнять гомография, если количество хороших матчей больше, чем 4 .О это было бы очень неэффективным с точки зрения производительности, так как я планирую использовать этот код для части JNI проекта android, над которой работает.

Может ли кто-нибудь, пожалуйста, направить меня на то, как перспектива преобразует и рисует прямоугольник вокруг обнаруженного объекта или предлагает какие-либо лучшие методы его выполнения. (Пока в моем поиске через Интернет я мог найти только 1 к 1 совпадению изображений а затем нарисовать гомографию для обнаруженного объекта)

ответ

1

Я сделал это раньше, и я не вижу лучшего решения, чем ставить большую часть его в цикл for. Вы должны просто взять то, что постоянно за пределами цикла, и попытаться повторно использовать данные вместо воссоздания всего для каждого цикла.

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

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