我使用下面几行代码在每一帧从相机中提取像素阵列,将其保存为jpg,然后在jpg上运行python进程。虽然它可以工作,但速度非常慢。瓶颈似乎是读取统一的像素。python进程本身仅持续0.02秒
有人能提出相对简单的方法来加速这个过程吗
我看过this,但它太高了,我无法理解如何使它适应我的用例
public override void Initialize()
{
renderTexture = new RenderTexture(84, 84, 24);
rawByteData = new byte[84 * 84 * bytesPerPixel];
texture2D = new Texture2D(84, 84, TextureFormat.RGB24, false);
rect = new Rect(0, 0, 84, 84);
cam.targetTexture = renderTexture;
}
private List<float> run_cmd()
{
// Setup a camera, texture and render texture
cam.targetTexture = renderTexture;
cam.Render();
// Read pixels to texture
RenderTexture.active = renderTexture;
texture2D.ReadPixels(rect, 0, 0);
rawByteData = ImageConversion.EncodeToJPG(texture2D);
// Assign random temporary filename to jpg
string fileName = "/media/home/tmp/" + Guid.NewGuid().ToString() + ".jpg";
File.WriteAllBytes(fileName, rawByteData); // Requires System.IO
// Start Python process
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "/media/home/path/to/python/exe";
start.Arguments = string.Format(
"/media/home/path/to/pythonfile.py photo {0}", fileName);
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
string stdout;
using(Process process = Process.Start(start))
{
using(StreamReader reader = process.StandardOutput)
{
stdout = reader.ReadToEnd();
}
}
string[] tokens = stdout.Split(',');
List<float> result = tokens.Select(x => float.Parse(x)).ToList();
System.IO.File.Delete(fileName);
return result;
}
在Unity 2018.1中,添加了一个用于从GPU-https://docs.unity3d.com/ScriptReference/Rendering.AsyncGPUReadback.html异步读取数据的新系统,在这个不需要使用摄影机获取纹理阵列的系统中,我编写了一个简单的示例,该示例运行良好,速度非常快:
您可以根据自己的任务调整此示例
相关问题 更多 >
编程相关推荐