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