def transformImage(opt,image,pMtrx):
refMtrx = util.toTorch(opt.refMtrx)
refMtrx = refMtrx.repeat(opt.batchSize,1,1)
transMtrx = refMtrx.matmul(pMtrx)
# warp the canonical coordinates
X,Y = np.meshgrid(np.linspace(-1,1,opt.W),np.linspace(-1,1,opt.H))
X,Y = X.flatten(),Y.flatten()
XYhom = np.stack([X,Y,np.ones_like(X)],axis=1).T
XYhom = np.tile(XYhom,[opt.batchSize,1,1]).astype(np.float32)
XYhom = util.toTorch(XYhom)
XYwarpHom = transMtrx.matmul(XYhom)
XwarpHom,YwarpHom,ZwarpHom = torch.unbind(XYwarpHom,dim=1)
Xwarp = (XwarpHom/(ZwarpHom+1e-8)).view(opt.batchSize,opt.H,opt.W)
Ywarp = (YwarpHom/(ZwarpHom+1e-8)).view(opt.batchSize,opt.H,opt.W)
grid = torch.stack([Xwarp,Ywarp],dim=-1)
# sampling with bilinear interpolation
imageWarp = torch.nn.functional.grid_sample(image,grid,mode="bilinear")
return imageWarp
评论列表
文章目录