TVL1计算光流,并进行warp

本文介绍如何使用TVL1算法计算两幅连续图像间的光流,并通过得到的光流场将后续图像校正到前一幅图像的时间点,实现图像序列的稳定显示。文中提供了详细的Python代码实现,包括OpenCV和PyTorch库的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TVL1计算光流,并进行warp

## TVL1光流
import cv2
def compute_TVL1(prev, curr):
    """Compute the TV-L1 optical flow."""
    TVL1 = cv2.optflow.DualTVL1OpticalFlow_create()
    # TVL1 = cv2.DualTVL1OpticalFlow_create()
    # TVL1=cv2.createOptFlow_DualTVL1()
#     t = time.time()
    # print(prev.shape,curr.shape)
    flow = TVL1.calc(prev, curr,None)
    return flow

img1 = cv2.imread("18_98.jpg",cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("18_99.jpg", cv2.IMREAD_GRAYSCALE)
print(img1.shape)
flow = compute_TVL1(img1,img2)
# flow = np.zeros((960,1280)).astype("float")
## 根据光流与图片,进行warp

import torch
from torch.autograd import Variable
from torch import nn
import numpy as np
import torchvision.transforms as transforms

def warp(x, flo):

    """
    warp an image/tensor (im2) back to im1, according to the optical flow
    x: [B, C, H, W] (im2)
    flo: [B, 2, H, W] flow
    """
    B, C, H, W = x.size()
    # mesh grid 
    xx = torch.arange(0, W).view(1,-1).repeat(H,1)
    yy = torch.arange(0, H).view(-1,1).repeat(1,W)
    xx = xx.view(1,1,H,W).repeat(B,1,1,1)
    yy = yy.view(1,1,H,W).repeat(B,1,1,1)
    grid = torch.cat((xx,yy),1).float()


    x = x
    grid = grid
    vgrid = Variable(grid) + flo # B,2,H,W
    #图二的每个像素坐标加上它的光流即为该像素点对应在图一的坐标

    # scale grid to [-1,1] 
    ##2019 code
    vgrid[:,0,:,:] = 2.0*vgrid[:,0,:,:].clone()/max(W-1,1)-1.0 
    #取出光流v这个维度,原来范围是0~W-1,再除以W-1,范围是0~1,再乘以2,范围是0~2,再-1,范围是-1~1
    vgrid[:,1,:,:] = 2.0*vgrid[:,1,:,:].clone()/max(H-1,1)-1.0 #取出光流u这个维度,同上

    vgrid = vgrid.permute(0,2,3,1)#from B,2,H,W -> B,H,W,2,为什么要这么变呢?是因为要配合grid_sample这个函数的使用
    output = nn.functional.grid_sample(x, vgrid,mode="bilinear",padding_mode="zeros")
    mask = torch.autograd.Variable(torch.ones(x.size()))
    mask = nn.functional.grid_sample(mask, vgrid,align_corners=True)

    ##2019 author
#     mask[mask<0.9999] = 0
#     mask[mask>0] = 1

    ##2019 code
    # mask = torch.floor(torch.clamp(mask, 0 ,1))

    return output

tvl1 = transforms.ToTensor()(flow).unsqueeze(0)
img=transforms.ToTensor((cv2.imread("18_98.jpg")).unsqueeze(0)
w = warp(img,tvl1)
w = w.squeeze(0)
w = np.transpose(w, (1,2,0)).numpy()
w = (w*255).astype("int")

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值