2016-09-21 3 views
1

Я создаю приложение для 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: Я хочу сшить изображения в том порядке, в котором они были сделаны, но над кодами для меня не работают, как я могу это сделать?

ответ

0

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

Эти углы поворота оцениваются с учетом камеры с самовозвращением, и мой случай использования включает пользователя, вращающего камеру (что означает, что это будет и некоторый перевод). Из-за этого (я думаю) горизонтальные углы (вокруг оси Y) являются сильно завышены, что означает, что алгоритм рассматривает набор изображений покрытия> = 360 градусов, которая приводит к некоторым перекрывающихся областей, которые не должны быть перекрыты.

Еще нету нашли решение этой проблемы, хотя.

0

согласовани() принимает UMat в качестве маски вместо объекта Mat, поэтому попробуйте следующий код:

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; 
} 

UMat umask = matchMask.getUMat(ACCESS_READ); 

matcher(features, pairwise_matches, umask); 
matcher.collectGarbage(); 
Смежные вопросы