如何将数据从 usb 转换为 OpenGL 纹理 passby CPU?
How to convert data from usb to OpenGL texture passby CPU?
从 USB 相机到 OpenGL 纹理的最佳数据传递是什么?
我知道的唯一方法是 usb-camera -> (cv.capture()) cv_image -> glGenTexture(image.bytes)
由于 CPU 会为每一帧解析图像,因此帧速率较低。
有没有更好的方法?
我正在使用 nvidia jetson tx2,是否有一些与环境相关的方法?
由于 USB 帧无论如何都必须由 USB 驱动程序和 UVC 协议处理程序重新组装,因此数据无论如何都会通过 CPU。最担心的是有多余的复制操作。
如果帧以 M-JPEG 格式传输(几乎所有兼容 UVC 的相机都支持),那么无论如何您都必须在 CPU 上对其进行解码,因为 GPU 视频解码加速硬件通常不支持覆盖 JPEG(JPEG 也非常容易解码)。
对于 YUV 颜色格式,建议创建两种纹理,一种用于 Y 通道,一种用于 UV 通道。通常 YUV 格式是平面的(即每个像素的单个组件的图像),因此您可以将 UV 纹理制作为具有两层的二维数组。由于色度分量可能会被二次采样,因此您需要单独的纹理来支持不同的分辨率。
输入的 RGB 数据是普通的 2D 纹理。
使用像素缓冲对象 (PBO) 进行传输。通过将 PBO 映射到主机内存 (glMapBuffer),您可以将来自相机的图像直接解码到暂存 PBO 中。取消映射后,对 glTexSubImage2D 的调用会将图像传输到 GPU 内存——在统一内存架构的情况下,这种“传输”可能就像围绕一些内部缓冲区引用进行混洗一样简单。
由于您没有提及用于访问视频设备的确切 API,因此很难提供更详细的信息。
从 USB 相机到 OpenGL 纹理的最佳数据传递是什么?
我知道的唯一方法是 usb-camera -> (cv.capture()) cv_image -> glGenTexture(image.bytes)
由于 CPU 会为每一帧解析图像,因此帧速率较低。
有没有更好的方法?
我正在使用 nvidia jetson tx2,是否有一些与环境相关的方法?
由于 USB 帧无论如何都必须由 USB 驱动程序和 UVC 协议处理程序重新组装,因此数据无论如何都会通过 CPU。最担心的是有多余的复制操作。
如果帧以 M-JPEG 格式传输(几乎所有兼容 UVC 的相机都支持),那么无论如何您都必须在 CPU 上对其进行解码,因为 GPU 视频解码加速硬件通常不支持覆盖 JPEG(JPEG 也非常容易解码)。
对于 YUV 颜色格式,建议创建两种纹理,一种用于 Y 通道,一种用于 UV 通道。通常 YUV 格式是平面的(即每个像素的单个组件的图像),因此您可以将 UV 纹理制作为具有两层的二维数组。由于色度分量可能会被二次采样,因此您需要单独的纹理来支持不同的分辨率。
输入的 RGB 数据是普通的 2D 纹理。
使用像素缓冲对象 (PBO) 进行传输。通过将 PBO 映射到主机内存 (glMapBuffer),您可以将来自相机的图像直接解码到暂存 PBO 中。取消映射后,对 glTexSubImage2D 的调用会将图像传输到 GPU 内存——在统一内存架构的情况下,这种“传输”可能就像围绕一些内部缓冲区引用进行混洗一样简单。
由于您没有提及用于访问视频设备的确切 API,因此很难提供更详细的信息。