Как использовать методы 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 совпадению изображений а затем нарисовать гомографию для обнаруженного объекта)