如何将EmguCV Image转换成Unity3D Sprite?

时间:2015-01-13 02:26:44

标签: c# unity3d emgucv unity3d-gui

我尝试在新的Unity3D UI系统上渲染Emgu相机捕捉的图像。 直到现在,我使用了此存储库中的ImageToTexture2d: https://github.com/neutmute/emgucv/blob/3ceb85cba71cf957d5e31ae0a70da4bbf746d0e8/Emgu.CV/PInvoke/Unity/TextureConvert.cs 然后使用Sprite.Create()最终实现想要的结果。

BUT!我的游戏运行2-3分钟后,看起来有一些大量的内存泄漏Unity编辑器突然占用大约3GB的RAM,大约200MB。

我有两个方面:

  1. (更多Probabble)我正在使用的方法不会清理内存。它使用InterOp并创建一些不安全的指针 - 它会闻到泄漏。
  2. 每次运行的Sprite.Create都会在内存中保存旧精灵,但不会将其删除。
  3. 你们是否知道将Emgu的图像转换为Sprite / Texture(不使用InterOp)或我可以在New Unity的UI上显示的任何其他方式的任何其他方法。它必须是Emgu的图像,因为我还对从相机中接收的图像进行了一些操作。

    提前感谢您的回复和帮助。 :d

4 个答案:

答案 0 :(得分:0)

在不了解游戏的大部分内容的情况下,您是否正在销毁在内存中创建的对象的可能复制品?

3GB突然增加是否与游戏中的任何行为有关?即使没有活动,它会增加吗?

答案 1 :(得分:0)

经过一番研究后,我发现了问题所在,但没有时间来描述它。我不知道Textures创建的每一帧都保存在引擎的某个地方。必须先销毁它们,然后再从Emgu Image生成一个新的。

这是我项目中使用的代码的一部分:

//Capture used for taking frames from webcam
private Capture capture;
//Frame image which was obtained and analysed by EmguCV
private Image<Bgr,byte> frame;
//Unity's Texture object which can be shown on UI
private Texture2D cameraTex;

//...

if(frame!=null)
    frame.Dispose();
frame = capture.QueryFrame();
if (frame != null)
{
    GameObject.Destroy(cameraTex);
    cameraTex = TextureConvert.ImageToTexture2D<Bgr, byte>(frame, true);
    Sprite.DestroyImmediate(CameraImageUI.GetComponent<UnityEngine.UI.Image>().sprite);
    CameraImageUI.sprite = Sprite.Create(cameraTex, new Rect(0, 0, cameraTex.width, cameraTex.height), new Vector2(0.5f, 0.5f));
}

答案 2 :(得分:0)

jsonMap.map((gallery) => new Gallery.fromJson(gallery)).toList();

答案 3 :(得分:0)

RawImage targetRawImage;
Image<Rgb, byte> scanned = new Image<Rgb, byte>("Assets/Textures/scanned.png");
Texture2D loaded = new Texture2D(scanned.Width, scanned.Height);
loaded.LoadImage(scanned.ToJpegData());
targetRawImage.texture = loaded;