|
|
@ -119,8 +119,10 @@ static void printUsage() |
|
|
|
" Blending strength from [0,100] range. The default is 5.\n" |
|
|
|
" Blending strength from [0,100] range. The default is 5.\n" |
|
|
|
" --output <result_img>\n" |
|
|
|
" --output <result_img>\n" |
|
|
|
" The default is 'result.jpg'.\n" |
|
|
|
" The default is 'result.jpg'.\n" |
|
|
|
" --timelapse (as_is|crop) (range_width)\n" |
|
|
|
" --timelapse (as_is|crop) \n" |
|
|
|
" Output warped images separately as frames of a time lapse movie, with 'fixed_' prepended to input file names.\n"; |
|
|
|
" Output warped images separately as frames of a time lapse movie, with 'fixed_' prepended to input file names.\n" |
|
|
|
|
|
|
|
" --rangewidth <int>\n" |
|
|
|
|
|
|
|
" uses range_width to limit number of images to match with.\n"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -148,7 +150,7 @@ int timelapse_type = Timelapser::AS_IS; |
|
|
|
float blend_strength = 5; |
|
|
|
float blend_strength = 5; |
|
|
|
string result_name = "result.jpg"; |
|
|
|
string result_name = "result.jpg"; |
|
|
|
bool timelapse = false; |
|
|
|
bool timelapse = false; |
|
|
|
int timelapse_range = 5; |
|
|
|
int range_width = -1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int parseCmdArgs(int argc, char** argv) |
|
|
|
static int parseCmdArgs(int argc, char** argv) |
|
|
@ -326,8 +328,10 @@ static int parseCmdArgs(int argc, char** argv) |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
i++; |
|
|
|
i++; |
|
|
|
|
|
|
|
} |
|
|
|
timelapse_range = atoi(argv[i + 1]); |
|
|
|
else if (string(argv[i]) == "--rangewidth") |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
range_width = atoi(argv[i + 1]); |
|
|
|
i++; |
|
|
|
i++; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (string(argv[i]) == "--blend_strength") |
|
|
|
else if (string(argv[i]) == "--blend_strength") |
|
|
@ -458,7 +462,7 @@ int main(int argc, char* argv[]) |
|
|
|
t = getTickCount(); |
|
|
|
t = getTickCount(); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
vector<MatchesInfo> pairwise_matches; |
|
|
|
vector<MatchesInfo> pairwise_matches; |
|
|
|
if (!timelapse) |
|
|
|
if (range_width==-1) |
|
|
|
{ |
|
|
|
{ |
|
|
|
BestOf2NearestMatcher matcher(try_cuda, match_conf); |
|
|
|
BestOf2NearestMatcher matcher(try_cuda, match_conf); |
|
|
|
matcher(features, pairwise_matches); |
|
|
|
matcher(features, pairwise_matches); |
|
|
@ -466,7 +470,7 @@ int main(int argc, char* argv[]) |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
BestOf2NearestRangeMatcher matcher(timelapse_range, try_cuda, match_conf); |
|
|
|
BestOf2NearestRangeMatcher matcher(range_width, try_cuda, match_conf); |
|
|
|
matcher(features, pairwise_matches); |
|
|
|
matcher(features, pairwise_matches); |
|
|
|
matcher.collectGarbage(); |
|
|
|
matcher.collectGarbage(); |
|
|
|
} |
|
|
|
} |
|
|
@ -813,9 +817,8 @@ int main(int argc, char* argv[]) |
|
|
|
} |
|
|
|
} |
|
|
|
blender->prepare(corners, sizes); |
|
|
|
blender->prepare(corners, sizes); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (!timelapser) |
|
|
|
else if (!timelapser && timelapse) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CV_Assert(timelapse); |
|
|
|
|
|
|
|
timelapser = Timelapser::createDefault(timelapse_type); |
|
|
|
timelapser = Timelapser::createDefault(timelapse_type); |
|
|
|
timelapser->initialize(corners, sizes); |
|
|
|
timelapser->initialize(corners, sizes); |
|
|
|
} |
|
|
|
} |
|
|
@ -824,8 +827,17 @@ int main(int argc, char* argv[]) |
|
|
|
if (timelapse) |
|
|
|
if (timelapse) |
|
|
|
{ |
|
|
|
{ |
|
|
|
timelapser->process(img_warped_s, Mat::ones(img_warped_s.size(), CV_8UC1), corners[img_idx]); |
|
|
|
timelapser->process(img_warped_s, Mat::ones(img_warped_s.size(), CV_8UC1), corners[img_idx]); |
|
|
|
|
|
|
|
String fixedFileName; |
|
|
|
imwrite("fixed_" + img_names[img_idx], timelapser->getDst()); |
|
|
|
size_t pos_s = String(img_names[img_idx]).find_last_of("/\\"); |
|
|
|
|
|
|
|
if (pos_s == String::npos) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
fixedFileName = "fixed_" + img_names[img_idx]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
fixedFileName = "fixed_" + String(img_names[img_idx]).substr(pos_s + 1, String(img_names[img_idx]).length() - pos_s); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
imwrite(fixedFileName, timelapser->getDst()); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|