(含源码)Python实现利用GPU加速透视变换

(含源码)利用NVIDIA VPI之透视变换

在这里插入图片描述

NVIDIA 视觉编程接口 (VPI: Vision Programming Interface) 是 NVIDIA 的计算机视觉和图像处理软件库,使您能够实现在 NVIDIA Jetson 嵌入式设备和独立的GPU 上可用的不同硬件后端上加速的算法。

库中的一些算法包括过滤方法、透视扭曲、时间降噪、直方图均衡、立体视差和镜头失真校正。 VPI 提供易于使用的 Python 绑定以及 C++ API。

除了与 OpenCV 接口外,VPI 还能够与 PyTorch 和其他基于 Python 的库进行互操作。 在这篇文章中,我们将通过基于 PyTorch 的目标检测和跟踪示例向您展示这种互操作性如何工作。 有关详细信息,请参阅视觉编程接口 (VPI) 页面视觉编程接口文档。

下面的示例获取输入视频并输出视频,其中对每一帧应用不同的透视扭曲。 结果是透视弹跳效果。 可以修改示例应用程序以从相机获取输入并实时应用效果。

import cv2
 import sys
 import vpi
 import numpy as np
 from math import sin, cos, pi
 from argparse import ArgumentParser
  
 # ----------------------------
 # Parse command line arguments
  
 parser = ArgumentParser()
 parser.add_argument('backend', choices=['cpu', 'cuda','vic'],
                     help='Backend to be used for processing')
  
 parser.add_argument('input',
                     help='Input video to be denoised')
  
 args = parser.parse_args();
  
 if args.backend == 'cuda':
     backend = vpi.Backend.CUDA
 elif args.backend == 'cpu':
     backend = vpi.Backend.CPU
 else:
     assert args.backend == 'vic'
     backend = vpi.Backend.VIC
  
 # -----------------------------
 # Open input and output videos
  
 inVideo = cv2.VideoCapture(args.input)
  
 fourcc = cv2.VideoWriter_fourcc(*'MPEG')
 inSize = (int(inVideo.get(cv2.CAP_PROP_FRAME_WIDTH)), int(inVideo.get(cv2.CAP_PROP_FRAME_HEIGHT)))
 fps = inVideo.get(cv2.CAP_PROP_FPS)
  
 outVideo = cv2.VideoWriter('perspwarp_python'+str(sys.version_info[0])+'_'+args.backend+'.mp4',
                             fourcc, fps, inSize)
  
 #--------------------------------------------------------------
 # Main processing loop
 curFrame = 1
 while True:
     print("Frame: {}".format(curFrame))
     curFrame+=1
  
     # Read one input frame
     ret, cvFrame = inVideo.read()
     if not ret:
         break
  
     # Convert it to NV12_ER format to be used by VPI
     with vpi.Backend.CUDA:
         frame = vpi.asimage(cvFrame).convert(vpi.Format.NV12_ER)
  
     # Calculate the transformation to be applied ------------
  
     # Move image's center to origin of coordinate system
     T1 = np.array([[1, 0, -frame.width/2.0],
                    [0, 1, -frame.height/2.0],
                    [0, 0, 1]])
  
     # Apply some time-dependent perspective transform
     v1 = sin(curFrame/30.0*2*pi/2)*0.0005
     v2 = cos(curFrame/30.0*2*pi/3)*0.0005
     P = np.array([[0.66, 0, 0],
                   [0, 0.66, 0],
                   [v1, v2, 1]])
  
     # Move image's center back to where it was
     T2 = np.array([[1, 0, frame.width/2.0],
                    [0, 1, frame.height/2.0],
                    [0, 0, 1]])
  
     # Do perspective warp using the backend passed in the command line.
     with backend:
         frame = frame.perspwarp(np.matmul(T2, np.matmul(P, T1)))
  
     # Convert it to RGB8 for output using the CUDA backend
     with vpi.Backend.CUDA:
         frame = frame.convert(vpi.Format.RGB8)
  
     # Write the denoised frame to the output video
     with frame.rlock_cpu() as data:
         outVideo.write(data)

原视频:

在这里插入图片描述

处理后输出视频:

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地的小何尚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值