void STWarp<T>::computePartialDerivatives( const WarpingField<T> &warpField, Video<T> &Bx, Video<T> &By, Video<T> &Bt, Video<T> &C) { VideoProcessing::dx(*videoB,Bx,true); VideoProcessing::dy(*videoB,By,true); VideoProcessing::dt(*videoB,Bt,true); Video<stwarp_video_t> warpedB(videoA->size()); C.copy(*videoA); VideoProcessing::backwardWarp(*videoB,warpField,warpedB); C.subtract(warpedB); // TODO: out of bounds set to 0 Video<T> temp(videoA->size()); VideoProcessing::backwardWarp(Bx,warpField,temp); Bx.copy(temp); temp.reset(0); VideoProcessing::backwardWarp(By,warpField,temp); By.copy(temp); temp.reset(0); if( !params.bypassTimeWarp ){ VideoProcessing::backwardWarp(Bt,warpField,temp); } Bt.copy(temp); }
void STWarp<T>::buildPyramid(vector<vector<int> > pyrSizes, vector<Video<stwarp_video_t>*> &pyramidA, vector<Video<stwarp_video_t>*> &pyramidB ) const{ int n = pyrSizes.size(); if(params.verbosity > 0) { printf("+ Building ST-pyramids with %d levels...",n); } pyramidA[0] = videoA; pyramidB[0] = videoB; Video<stwarp_video_t> copy; for (int i = 1; i < n; ++i) { pyramidA[i] = new Video<stwarp_video_t>(pyrSizes[i][0], pyrSizes[i][1],pyrSizes[i][2],dimensions[3]); pyramidB[i] = new Video<stwarp_video_t>(pyrSizes[i][0], pyrSizes[i][1],pyrSizes[i][2],dimensions[3]); // Lowpass and downsample copy.copy(*pyramidA[i-1]); VideoProcessing::resize(copy,pyramidA[i]); copy.copy(*pyramidB[i-1]); VideoProcessing::resize(copy,pyramidB[i]); } if(params.verbosity >0) { printf("done.\n"); } }