• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * libdvs.cpp - abstract for DVS (Digital Video Stabilizer)
3  *
4  *    Copyright (c) 2014-2016 Intel Corporation
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *        http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * Author: Zong Wei <wei.zong@intel.com>
19  */
20 
21 #include <opencv2/core.hpp>
22 #include <opencv2/core/ocl.hpp>
23 #include <opencv2/core/utility.hpp>
24 
25 #include "libdvs.h"
26 #include "stabilizer.h"
27 
28 struct DigitalVideoStabilizer : DvsInterface
29 {
~DigitalVideoStabilizerDigitalVideoStabilizer30     virtual ~DigitalVideoStabilizer() {}
31 
32     int init(int width, int height, bool twoPass);
33 
34     void setConfig(DvsConfig* config);
35 
36     void release();
37 
38     void nextStabilizedMotion(DvsData* frame, DvsResult* result);
39 
40 
41     VideoStabilizer* _videoStab;
42 
DigitalVideoStabilizerDigitalVideoStabilizer43     DigitalVideoStabilizer () {
44         _videoStab = NULL;
45     }
46 };
47 
init(int width,int height,bool twoPass)48 int DigitalVideoStabilizer::init(int width, int height, bool twoPass)
49 {
50     cv::Size frameSize;
51     frameSize.width = width;
52     frameSize.height = height;
53 
54     if (_videoStab != NULL) {
55         delete _videoStab;
56         _videoStab = NULL;
57     }
58     _videoStab = new VideoStabilizer(twoPass, false, false, false);
59     if (_videoStab == NULL) {
60         return -1;
61     }
62 
63     // stabilizer configuration
64     _videoStab->setFrameSize(frameSize);
65     _videoStab->configFeatureDetector(1000, 15);
66 
67     return 0;
68 }
69 
setConfig(DvsConfig * config)70 void DigitalVideoStabilizer::setConfig(DvsConfig* config)
71 {
72     if (NULL == _videoStab) {
73         return;
74     }
75     // stabilizer configuration
76     _videoStab->setFrameSize(cv::Size(config->frame_width, config->frame_height));
77     _videoStab->configMotionFilter(config->radius, config->stdev);
78     _videoStab->configFeatureDetector(config->features, config->minDistance);
79 }
80 
release()81 void DigitalVideoStabilizer::release()
82 {
83     if (_videoStab != NULL) {
84         delete _videoStab;
85     }
86 }
87 
nextStabilizedMotion(DvsData * frame,DvsResult * result)88 void DigitalVideoStabilizer::nextStabilizedMotion(DvsData* frame, DvsResult* result)
89 {
90     if ((NULL == _videoStab) || (NULL == result)) {
91         return;
92     }
93     result->frame_id = -1;
94     result->frame_width = _videoStab->getFrameSize().width;
95     result->frame_height = _videoStab->getFrameSize().height;
96 
97     cv::Mat HMatrix = _videoStab->nextStabilizedMotion(frame, result->frame_id);
98 
99     if (HMatrix.empty()) {
100         result->valid = false;
101         result->proj_mat[0][0] = 1.0f;
102         result->proj_mat[0][1] = 0.0f;
103         result->proj_mat[0][2] = 0.0f;
104         result->proj_mat[1][0] = 0.0f;
105         result->proj_mat[1][1] = 1.0f;
106         result->proj_mat[1][2] = 0.0f;
107         result->proj_mat[2][0] = 0.0f;
108         result->proj_mat[2][1] = 0.0f;
109         result->proj_mat[2][2] = 1.0f;
110         return;
111     }
112 
113     cv::Mat invHMat = HMatrix.inv();
114     result->valid = true;
115 
116     for( int i = 0; i < 3; i++ ) {
117         for( int j = 0; j < 3; j++ ) {
118             result->proj_mat[i][j] = invHMat.at<float>(i, j);
119         }
120     }
121 #if 0
122     printf ("proj_mat(%d, :)={%f, %f, %f, %f, %f, %f, %f, %f, %f}; \n", result->frame_id + 1,
123             result->proj_mat[0][0], result->proj_mat[0][1], result->proj_mat[0][2],
124             result->proj_mat[1][0], result->proj_mat[1][1], result->proj_mat[1][2],
125             result->proj_mat[2][0], result->proj_mat[2][1], result->proj_mat[2][2]);
126 
127     printf ("amplitude(%d, :)={%f, %f}; \n", result->frame_id + 1,
128             result->proj_mat[0][2], result->proj_mat[1][2]);
129 #endif
130 }
131 
getDigitalVideoStabilizer(void)132 DvsInterface* getDigitalVideoStabilizer(void)
133 {
134     return new DigitalVideoStabilizer();
135 }
136 
137 
138 
139