Opencv 使用Unity3D中的PInvoke将cv::Mat上载到D3D纹理

Opencv 使用Unity3D中的PInvoke将cv::Mat上载到D3D纹理,opencv,unity3d,directx,directx-11,Opencv,Unity3d,Directx,Directx 11,处境 我有一台工业吉格相机。GigE或USB或任何其他接口在这里都不重要。关键是,摄像头不应被视为网络摄像头,因为它有自己的驱动程序。使用这个CameraSDK,我可以用OpenCV将图像读取到cv::Mat中,然后对这些图像进行转换、不失真和其他处理。这样行 然后,我想使用该相机在Unity3D(OS=Windows)中实时对四边形进行纹理处理。我编写了一个DLL,它使用CPU将图像复制到纹理2D中,该DLL在Unity3D中使用PInvoke调用。管道是: 一幅图像从相机的传感器中读出到cv

处境

我有一台工业吉格相机。GigE或USB或任何其他接口在这里都不重要。关键是,摄像头不应被视为网络摄像头,因为它有自己的驱动程序。使用这个CameraSDK,我可以用OpenCV将图像读取到cv::Mat中,然后对这些图像进行转换、不失真和其他处理。这样行

然后,我想使用该相机在Unity3D(OS=Windows)中实时对四边形进行纹理处理。我编写了一个DLL,它使用CPU将图像复制到纹理2D中,该DLL在Unity3D中使用PInvoke调用。管道是:

  • 一幅图像从相机的传感器中读出到cv::Mat中
  • cv::Mat被复制到非托管缓冲区(Unity3D非托管内存中的缓冲区)
  • 将非托管缓冲区封送到托管缓冲区中
  • 通过调用LoadRawTextureData(字节[]managedBuffer),将托管缓冲区加载(复制)到Texture2D内部缓冲区中
  • Texture2D内部缓冲区通过调用Apply上传到GPU
  • 在写这个问题时,我注意到Texture2D有另一种形式(自从我编写了我认为是DLL以来的新形式)用于从非托管缓冲区加载其内部缓冲区:

    因此,可以删除步骤2和步骤3,但在上传到GPU之前,仍然必须加载Texture2D内部缓冲区

    问题

    我想从管道中尽可能多地排空CPU我想将cv::Mat直接上传到GPU中的Texture2D中。

    有一种Texture2D方法可以在GPU上获取本机纹理指针:


    我不知道怎么处理。我知道Direct3D的一些基本知识(特别是D3D11),但我不是专家。有没有人能解释一下,无论有没有代码,如何将一些cv::Mat复制到一些D3D11(或适用于Windows 10的D3D12)纹理?

    整个网站的第一个好统一问题