//-------------------------------------------------------------------------------------------------------- // function to generate mask of the pixels that move inside the image boundary //-------------------------------------------------------------------------------------------------------- void OpticalFlow::genInImageMask(DImage &mask, const DImage &vx, const DImage &vy,int interval) { int imWidth,imHeight; imWidth=vx.width(); imHeight=vx.height(); if(mask.matchDimension(vx)==false) mask.allocate(imWidth,imHeight); const _FlowPrecision *pVx,*pVy; _FlowPrecision *pMask; pVx=vx.data(); pVy=vy.data(); mask.reset(); pMask=mask.data(); double x,y; for(int i=0;i<imHeight;i++) for(int j=0;j<imWidth;j++) { int offset=i*imWidth+j; y=i+pVx[offset]; x=j+pVy[offset]; if(x<interval || x>imWidth-1-interval || y<interval || y>imHeight-1-interval) continue; pMask[offset]=1; } }
void OpticalFlow::genInImageMask(DImage &mask, const DImage &flow,int interval) { int imWidth,imHeight; imWidth=flow.width(); imHeight=flow.height(); if(mask.matchDimension(flow.width(),flow.height(),1)==false) mask.allocate(imWidth,imHeight); else mask.reset(); const _FlowPrecision *pFlow; _FlowPrecision *pMask; pFlow = flow.data();; pMask=mask.data(); double x,y; for(int i=0;i<imHeight;i++) for(int j=0;j<imWidth;j++) { int offset=i*imWidth+j; y=i+pFlow[offset*2+1]; x=j+pFlow[offset*2]; if(x<interval || x>imWidth-1-interval || y<interval || y>imHeight-1-interval) continue; pMask[offset]=1; } }
void OpticalFlow::Laplacian(DImage &output, const DImage &input, const DImage& weight) { if(output.matchDimension(input)==false) output.allocate(input); output.reset(); if(input.matchDimension(weight)==false) { cout<<"Error in image dimension matching OpticalFlow::Laplacian()!"<<endl; return; } const _FlowPrecision *inputData=input.data(),*weightData=weight.data(); int width=input.width(),height=input.height(); DImage foo(width,height); _FlowPrecision *fooData=foo.data(),*outputData=output.data(); // horizontal filtering for(int i=0;i<height;i++) for(int j=0;j<width-1;j++) { int offset=i*width+j; fooData[offset]=(inputData[offset+1]-inputData[offset])*weightData[offset]; } for(int i=0;i<height;i++) for(int j=0;j<width;j++) { int offset=i*width+j; if(j<width-1) outputData[offset]-=fooData[offset]; if(j>0) outputData[offset]+=fooData[offset-1]; } foo.reset(); // vertical filtering for(int i=0;i<height-1;i++) for(int j=0;j<width;j++) { int offset=i*width+j; fooData[offset]=(inputData[offset+width]-inputData[offset])*weightData[offset]; } for(int i=0;i<height;i++) for(int j=0;j<width;j++) { int offset=i*width+j; if(i<height-1) outputData[offset]-=fooData[offset]; if(i>0) outputData[offset]+=fooData[offset-width]; } }