void checkSameSizeAndDepth(InputArrayOfArrays src, Size &sz, int &depth) { CV_Assert(src.isMat() || src.isUMat() || src.isMatVector() || src.isUMatVector()); if (src.isMat() || src.isUMat()) { CV_Assert(!src.empty()); sz = src.size(); depth = src.depth(); } else if (src.isMatVector()) { const vector<Mat>& srcv = *static_cast<const vector<Mat>*>(src.getObj()); CV_Assert(srcv.size() > 0); for (unsigned i = 0; i < srcv.size(); i++) { CV_Assert(srcv[i].depth() == srcv[0].depth()); CV_Assert(srcv[i].size() == srcv[0].size()); } sz = srcv[0].size(); depth = srcv[0].depth(); } else if (src.isUMatVector()) { const vector<UMat>& srcv = *static_cast<const vector<UMat>*>(src.getObj()); CV_Assert(srcv.size() > 0); for (unsigned i = 0; i < srcv.size(); i++) { CV_Assert(srcv[i].depth() == srcv[0].depth()); CV_Assert(srcv[i].size() == srcv[0].size()); } sz = srcv[0].size(); depth = srcv[0].depth(); } }
int getTotalNumberOfChannels(InputArrayOfArrays src) { CV_Assert(src.isMat() || src.isUMat() || src.isMatVector() || src.isUMatVector()); if (src.isMat() || src.isUMat()) { return src.channels(); } else if (src.isMatVector()) { int cnNum = 0; const vector<Mat>& srcv = *static_cast<const vector<Mat>*>(src.getObj()); for (unsigned i = 0; i < srcv.size(); i++) cnNum += srcv[i].channels(); return cnNum; } else if (src.isUMatVector()) { int cnNum = 0; const vector<UMat>& srcv = *static_cast<const vector<UMat>*>(src.getObj()); for (unsigned i = 0; i < srcv.size(); i++) cnNum += srcv[i].channels(); return cnNum; } else { return 0; } }
void BTVL1_Base::process(InputArrayOfArrays _src, OutputArray _dst, InputArrayOfArrays _forwardMotions, InputArrayOfArrays _backwardMotions, int baseIdx) { CV_Assert( scale_ > 1 ); CV_Assert( iterations_ > 0 ); CV_Assert( tau_ > 0.0 ); CV_Assert( alpha_ > 0.0 ); CV_Assert( btvKernelSize_ > 0 ); CV_Assert( blurKernelSize_ > 0 ); CV_Assert( blurSigma_ >= 0.0 ); CV_OCL_RUN(_src.isUMatVector() && _dst.isUMat() && _forwardMotions.isUMatVector() && _backwardMotions.isUMatVector(), ocl_process(_src, _dst, _forwardMotions, _backwardMotions, baseIdx)) std::vector<Mat> & src = *(std::vector<Mat> *)_src.getObj(), & forwardMotions = *(std::vector<Mat> *)_forwardMotions.getObj(), & backwardMotions = *(std::vector<Mat> *)_backwardMotions.getObj(); // update blur filter and btv weights if (!filter_ || blurKernelSize_ != curBlurKernelSize_ || blurSigma_ != curBlurSigma_ || src[0].type() != curSrcType_) { filter_ = createGaussianFilter(src[0].type(), Size(blurKernelSize_, blurKernelSize_), blurSigma_); curBlurKernelSize_ = blurKernelSize_; curBlurSigma_ = blurSigma_; curSrcType_ = src[0].type(); } if (btvWeights_.empty() || btvKernelSize_ != curBtvKernelSize_ || alpha_ != curAlpha_) { calcBtvWeights(btvKernelSize_, alpha_, btvWeights_); curBtvKernelSize_ = btvKernelSize_; curAlpha_ = alpha_; } // calc high res motions calcRelativeMotions(forwardMotions, backwardMotions, lowResForwardMotions_, lowResBackwardMotions_, baseIdx, src[0].size()); upscaleMotions(lowResForwardMotions_, highResForwardMotions_, scale_); upscaleMotions(lowResBackwardMotions_, highResBackwardMotions_, scale_); forwardMaps_.resize(highResForwardMotions_.size()); backwardMaps_.resize(highResForwardMotions_.size()); for (size_t i = 0; i < highResForwardMotions_.size(); ++i) buildMotionMaps(highResForwardMotions_[i], highResBackwardMotions_[i], forwardMaps_[i], backwardMaps_[i]); // initial estimation const Size lowResSize = src[0].size(); const Size highResSize(lowResSize.width * scale_, lowResSize.height * scale_); resize(src[baseIdx], highRes_, highResSize, 0, 0, INTER_CUBIC); // iterations diffTerm_.create(highResSize, highRes_.type()); a_.create(highResSize, highRes_.type()); b_.create(highResSize, highRes_.type()); c_.create(lowResSize, highRes_.type()); for (int i = 0; i < iterations_; ++i) { diffTerm_.setTo(Scalar::all(0)); for (size_t k = 0; k < src.size(); ++k) { // a = M * Ih remap(highRes_, a_, backwardMaps_[k], noArray(), INTER_NEAREST); // b = HM * Ih filter_->apply(a_, b_); // c = DHM * Ih resize(b_, c_, lowResSize, 0, 0, INTER_NEAREST); diffSign(src[k], c_, c_); // a = Dt * diff upscale(c_, a_, scale_); // b = HtDt * diff filter_->apply(a_, b_); // a = MtHtDt * diff remap(b_, a_, forwardMaps_[k], noArray(), INTER_NEAREST); add(diffTerm_, a_, diffTerm_); } if (lambda_ > 0) { calcBtvRegularization(highRes_, regTerm_, btvKernelSize_, btvWeights_, ubtvWeights_); addWeighted(diffTerm_, 1.0, regTerm_, -lambda_, 0.0, diffTerm_); } addWeighted(highRes_, 1.0, diffTerm_, tau_, 0.0, highRes_); } Rect inner(btvKernelSize_, btvKernelSize_, highRes_.cols - 2 * btvKernelSize_, highRes_.rows - 2 * btvKernelSize_); highRes_(inner).copyTo(_dst); }