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