You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Nvidia VPI实现摄像头视频透视变换后如何实时显示输出?

解决VPI透视变换后实时显示的问题

错误原因:cv2.imshow仅支持numpy数组、cv::GpuMat或cv::UMat类型,而VPI处理生成的output是VPI专属的Image对象,无法直接被OpenCV识别,因此抛出类型不匹配的错误。

解决方法:需要将VPI Image同步到CPU端并转换为numpy数组,再传给cv2.imshow。具体修改如下:

  1. 在with output.rlock()上下文内,获取CPU端的numpy数组(output.cpu()),上下文确保GPU到CPU的数据同步安全
  2. 添加cv2.imshow显示该数组,同时必须调用cv2.waitKey(1)实现窗口刷新和退出逻辑

修改后的完整代码:

import cv2
import vpi

cap = cv2.VideoCapture(0)

xform = [[  0.5386, 0.1419, -74   ],
         [ -0.4399, 0.8662, 291.5   ],
         [ -0.0005, 0.0003, 1     ]]

fourcc = cv2.VideoWriter_fourcc(*'avc1')
inSize = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = cap.get(cv2.CAP_PROP_FPS)

outVideo = cv2.VideoWriter('perspwarp_python.mp4', fourcc, fps, inSize)

while True:
    _, frame = cap.read()
    if frame is None:
        break

    with vpi.Backend.CUDA:
        frame = vpi.asimage(frame).convert(vpi.Format.NV12_ER)

    with vpi.Backend.CUDA:
        output = frame.perspwarp(xform)

    with vpi.Backend.CUDA:
        output = output.convert(vpi.Format.RGB8)

    with output.rlock():
        cpu_frame = output.cpu()
        outVideo.write(cpu_frame)
        # 实时显示处理后的帧
        cv2.imshow('Perspective Warp Output', cpu_frame)
    
    # 按q键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
outVideo.release()
cv2.destroyAllWindows()

注意事项:

  • 必须在output.rlock()内获取cpu数组,否则可能出现数据未同步的问题
  • cv2.waitKey(1)中的1表示等待1毫秒,确保窗口正常刷新,同时监听按键输入
  • 退出时要释放摄像头、视频写入器资源,并销毁OpenCV窗口

内容的提问来源于stack exchange,提问作者Aleks-CST

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:57:24