Unity C# Texture图像传输到C++ dll的方法

博客介绍了如何优化Unity中Texture到C++DLL的图像传输,通过使用RenderTexture避免了Unity将Texture转为byte数组时的性能损耗。在C#端利用Texture2D获取像素并转换为byte数组,然后在C++端用Mat处理,注意由于数据顺序问题需要进行额外的翻转和颜色空间转换。
ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

各位我最近又找到了更好的办法~
因为用原来的办法虽然可以正确传输,但由于unity中需要将texture转成byte数组,gc会占用很多时间,因此研究了一下换了一种新的办法:

Unity C# Texture发送到C++ dll的方法 升级版

此方法需要调用dx11,本人也是新手,希望大佬们发现我写的有什么不对的地方能帮我指出!

原文:
最近在写dll,用opencv处理图像,但是图像信息要从unity那边传过来,我们本来使用的方法是用byte数组传递:

void transferImage(byte* pImg, int width, int height)
{
	image = cv::Mat(height, width, CV_8UC3, pImg).clone();
	flip(p_FaceParam->input_frame, p_FaceParam->input_frame, 0);
}

但是后来发现unity那边获取Texture转成byte还需要一定的时间,所以最近发现了一个更好的办法

这个方法转载自链接:
在Unity3D和OpenCV之间传递图片(Texture2D/WebCamTexture转Mat).

C#:

using System;
using System.Runtime.InteropServices;

Texture2D TextureToTexture2D(Texture texture)
{
    Texture2D texture2D = new Texture2D(texture.width, texture.height, TextureFormat.RGBA32, false);
    RenderTexture currentRT = RenderTexture.active;
    RenderTexture renderTexture = RenderTexture.GetTemporary(texture.width, texture.height, 32);
    Graphics.Blit(texture, renderTexture);
    RenderTexture.active = renderTexture;
    texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
    texture2D.Apply();
    RenderTexture.active = currentRT;
    RenderTexture.ReleaseTemporary(renderTexture);
    return texture2D;
}

pixels = texture2D.GetPixels32();
GCHandle pixelHandle = GCHandle.Alloc(pixels, GCHandleType.Pinned);
IntPtr pixelPointer = pixelHandle.AddrOfPinnedObject();

C++:

void transferImage(char* pImg, int width, int height)
{
	Mat image(height, width, CV_8UC4);
	memcpy(image.data, pImg, width*height * 4);
	flip(image, image, -1);
	cv::cvtColor(image, image, cv::COLOR_RGBA2BGR);
}

特别注意的是,因为传过来的数据保存到cv::Mat里相当于是整个数据顺序颠倒,所以不光 图像需要做xy轴的镜像,还要转换一次RGBA2BGR。
如果你想直接保存CV_8UC3的话,C#那边需要传TextureFormat.RGB24的。
再次感谢@佐晓佐大神的文章!

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值