| /* |
| * 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 <[email protected]> |
| */ |
| |
| #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(); |
| } |
| |
| |
| |