/*
* test-image-stabilization.cpp - test image stabilization
*
* Copyright (c) 2016 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Author: Zong Wei <wei.zong@intel.com>
*/
#include <unistd.h>
#include <getopt.h>
#include <string>
#include <base/xcam_defs.h>
#include "stabilizer.h"
using namespace std;
using namespace cv;
using namespace cv::videostab;
void usage(const char* arg0)
{
printf ("Usage:\n"
"%s --input file --output file\n"
"\t--input input video\n"
"\t--output output video\n"
"\t--enable-twopass two pass stabilization\n"
"\t--enable-deblur do deblur on output video\n"
"\t--wobble-suppress do wobble suppress\n"
"\t--save save file or not, default: true\n"
"\t--help usage\n",
arg0);
}
int main(int argc, char *argv[])
{
char inputPath[XCAM_MAX_STR_SIZE] = {0};
char outputPath[XCAM_MAX_STR_SIZE] = {0};
bool enableTwoPass = false;
bool enableDeblur = false;
bool wobbleSuppress = false;
bool saveOutput = true;
const struct option long_opts[] = {
{"input", required_argument, NULL, 'i'},
{"output", required_argument, NULL, 'o'},
{"enable-twopass", required_argument, NULL, 'p'},
{"enable-deblur", required_argument, NULL, 'd'},
{"wobble-suppress", required_argument, NULL, 'w'},
{"save", required_argument, NULL, 's'},
{"help", no_argument, NULL, 'e'},
{NULL, 0, NULL, 0},
};
int opt = -1;
while ((opt = getopt_long(argc, argv, "", long_opts, NULL)) != -1) {
switch (opt) {
case 'i':
strncpy (inputPath, optarg, XCAM_MAX_STR_SIZE);
break;
case 'o':
strncpy (outputPath, optarg, XCAM_MAX_STR_SIZE);
break;
case 'p':
enableTwoPass = (strcasecmp (optarg, "false") == 0 ? false : true);;
break;
case 'd':
enableDeblur = (strcasecmp (optarg, "false") == 0 ? false : true);
break;
case 'w':
wobbleSuppress = (strcasecmp (optarg, "false") == 0 ? false : true);
break;
case 's':
saveOutput = (strcasecmp (optarg, "false") == 0 ? false : true);
break;
case 'e':
usage (argv[0]);
return -1;
default:
printf ("getopt_long return unknown value:%c \n", opt);
usage (argv[0]);
return -1;
}
}
if (optind < argc || argc < 2) {
printf ("unknown option %s \n", argv[optind]);
usage (argv[0]);
return -1;
}
printf ("Description----------------\n");
printf ("input file:\t%s\n", inputPath);
printf ("output file:\t%s\n", outputPath);
printf ("enable two pass stabilizer:\t%s\n", enableTwoPass ? "true" : "false");
printf ("enable deblur:\t%s\n", enableDeblur ? "true" : "false");
printf ("enable wobble suppress:\t%s\n", wobbleSuppress ? "true" : "false");
printf ("save file:\t%s\n", saveOutput ? "true" : "false");
printf ("---------------------------\n");
Ptr<VideoStabilizer> dvs = makePtr<VideoStabilizer>(enableTwoPass, wobbleSuppress, enableDeblur);
Ptr<StabilizerBase> stabilizer = dvs->stabilizer();
Ptr<VideoFileSource> source = makePtr<VideoFileSource>(inputPath);
stabilizer->setFrameSource(source);
int outputFps = source->fps();
Size frameSize = Size(source->width(), source->height());
cout << "frame count (rough): " << source->count() << endl;
cout << "output FPS: " << outputFps << endl;
cout << "frame size: " << source->width() << "x" << source->height() << endl;
// stabilizer configuration
dvs->configFeatureDetector(1000, 15.0f);
dvs->configMotionFilter(15, 10.0f);
// start to run
Mat stabilizedFrame, croppedStabilizedFrame;
int nframes = 0;
while (!(stabilizedFrame = dvs->nextFrame()).empty())
{
nframes++;
cout << nframes << endl;
// doing cropping here
croppedStabilizedFrame = dvs->cropVideoFrame(stabilizedFrame);
if (saveOutput) {
if (!dvs->writer_.isOpened()) {
dvs->writer_.open(outputPath, VideoWriter::fourcc('X', '2', '6', '4'),
outputFps, dvs->trimedVideoSize(frameSize));
}
dvs->writer_.write(croppedStabilizedFrame);
}
imshow("stabilizedFrame", croppedStabilizedFrame);
char key = static_cast<char>(waitKey(3));
if (key == 27) {
cout << endl;
break;
}
}
return 0;
}