Я создаю приложение для Android, чтобы создавать панорамы. Пользователь захватывает набор изображений, и эти изображения отправляются на мою собственную функцию строчки, которая была основана на https://github.com/opencv/opencv/blob/master/samples/cpp/stitching_detailed.cpp. Поскольку изображения в порядке, я хотел бы сопоставить каждое изображение только со следующим изображением в векторе.OpenCV 3.1 Сшивайте изображения, чтобы они были сделаны
Я нашел статью Intel, которая делает только, что с помощью следующего кода:
vector<MatchesInfo> pairwise_matches;
BestOf2NearestMatcher matcher(try_gpu, match_conf);
Mat matchMask(features.size(),features.size(),CV_8U,Scalar(0));
for (int i = 0; i < num_images -1; ++i)
{
matchMask.at<char>(i,i+1) =1;
}
matcher(features, pairwise_matches,matchMask);
matcher.collectGarbage();
Проблема, это обыкновение компилировать. Я предполагаю, что это связано с использованием OpenCV 3.1. Тогда я нашел где-то, что этот код будет делать то же самое:
int range_width = 2;
BestOf2NearestRangeMatcher matcher(range_width, try_cuda, match_conf);
matcher(features, pairwise_matches);
matcher.collectGarbage();
И для большинства из моих образцов это работает отлично. Однако иногда, особенно когда im строчка большой набор изображений (около 15), некоторые объекты появляются на вершине eachother и в местах, где они не должны. Я также заметил, что «начало» (левая сторона) конечного результата не является первым изображением в векторе либо , что является странным.
Я использую «orb» как feature_type и «ray» как ba_cost_func. Похоже, я не могу использовать SURF на OpenCV 3.1. Остальные мои начальных параметров выглядеть следующим образом:
bool try_cuda = false;
double compose_megapix = -1; //keeps resolution for final panorama
float match_conf = 0.3f; //0.3 default for orb
string ba_refine_mask = "xxxxx";
bool do_wave_correct = true;
WaveCorrectKind wave_correct = detail::WAVE_CORRECT_HORIZ;
int blend_type = Blender::MULTI_BAND;
float blend_strength = 5;
double work_megapix = 0.6;
double seam_megapix = 0.08;
float conf_thresh = 0.5f;
int expos_comp_type = ExposureCompensator::GAIN_BLOCKS;
string seam_find_type = "dp_colorgrad";
string warp_type = "spherical";
Так может кто-нибудь просветить меня, почему это не работает, и как я должен соответствовать моим чертам? Любая помощь или руководство были бы высоко оценены!
TL; DR: Я хочу сшить изображения в том порядке, в котором они были сделаны, но над кодами для меня не работают, как я могу это сделать?