/*
* libdvs.cpp - abstract for DVS (Digital Video Stabilizer)
*
* Copyright (c) 2014-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 <opencv2/core.hpp>
#include <opencv2/core/ocl.hpp>
#include <opencv2/core/utility.hpp>
#include "libdvs.h"
#include "stabilizer.h"
struct DigitalVideoStabilizer : DvsInterface
{
virtual ~DigitalVideoStabilizer() {}
int init(int width, int height, bool twoPass);
void setConfig(DvsConfig* config);
void release();
void nextStabilizedMotion(DvsData* frame, DvsResult* result);
VideoStabilizer* _videoStab;
DigitalVideoStabilizer () {
_videoStab = NULL;
}
};
int DigitalVideoStabilizer::init(int width, int height, bool twoPass)
{
cv::Size frameSize;
frameSize.width = width;
frameSize.height = height;
if (_videoStab != NULL) {
delete _videoStab;
_videoStab = NULL;
}
_videoStab = new VideoStabilizer(twoPass, false, false, false);
if (_videoStab == NULL) {
return -1;
}
// stabilizer configuration
_videoStab->setFrameSize(frameSize);
_videoStab->configFeatureDetector(1000, 15);
return 0;
}
void DigitalVideoStabilizer::setConfig(DvsConfig* config)
{
if (NULL == _videoStab) {
return;
}
// stabilizer configuration
_videoStab->setFrameSize(cv::Size(config->frame_width, config->frame_height));
_videoStab->configMotionFilter(config->radius, config->stdev);
_videoStab->configFeatureDetector(config->features, config->minDistance);
}
void DigitalVideoStabilizer::release()
{
if (_videoStab != NULL) {
delete _videoStab;
}
}
void DigitalVideoStabilizer::nextStabilizedMotion(DvsData* frame, DvsResult* result)
{
if ((NULL == _videoStab) || (NULL == result)) {
return;
}
result->frame_id = -1;
result->frame_width = _videoStab->getFrameSize().width;
result->frame_height = _videoStab->getFrameSize().height;
cv::Mat HMatrix = _videoStab->nextStabilizedMotion(frame, result->frame_id);
if (HMatrix.empty()) {
result->valid = false;
result->proj_mat[0][0] = 1.0f;
result->proj_mat[0][1] = 0.0f;
result->proj_mat[0][2] = 0.0f;
result->proj_mat[1][0] = 0.0f;
result->proj_mat[1][1] = 1.0f;
result->proj_mat[1][2] = 0.0f;
result->proj_mat[2][0] = 0.0f;
result->proj_mat[2][1] = 0.0f;
result->proj_mat[2][2] = 1.0f;
return;
}
cv::Mat invHMat = HMatrix.inv();
result->valid = true;
for( int i = 0; i < 3; i++ ) {
for( int j = 0; j < 3; j++ ) {
result->proj_mat[i][j] = invHMat.at<float>(i, j);
}
}
#if 0
printf ("proj_mat(%d, :)={%f, %f, %f, %f, %f, %f, %f, %f, %f}; \n", result->frame_id + 1,
result->proj_mat[0][0], result->proj_mat[0][1], result->proj_mat[0][2],
result->proj_mat[1][0], result->proj_mat[1][1], result->proj_mat[1][2],
result->proj_mat[2][0], result->proj_mat[2][1], result->proj_mat[2][2]);
printf ("amplitude(%d, :)={%f, %f}; \n", result->frame_id + 1,
result->proj_mat[0][2], result->proj_mat[1][2]);
#endif
}
DvsInterface* getDigitalVideoStabilizer(void)
{
return new DigitalVideoStabilizer();
}