基于Nvidia VPI实现摄像头视频透视变换后如何实时显示输出?
解决VPI透视变换后实时显示的问题
错误原因:cv2.imshow仅支持numpy数组、cv::GpuMat或cv::UMat类型,而VPI处理生成的output是VPI专属的Image对象,无法直接被OpenCV识别,因此抛出类型不匹配的错误。
解决方法:需要将VPI Image同步到CPU端并转换为numpy数组,再传给cv2.imshow。具体修改如下:
- 在
with output.rlock()上下文内,获取CPU端的numpy数组(output.cpu()),上下文确保GPU到CPU的数据同步安全 - 添加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
相关产品推荐
相关产品推荐

