【发布时间】:2019-12-26 15:23:46
【问题描述】:
我正在尝试制作一个简单的动作捕捉系统。我的做法是,我必须让相机(手机)以 90° 角拍摄同一个主题。通过这两个摄像头的馈送,我检测到想要的颜色,计算它们的相对 3D 位置,然后使用blender3D 在该位置绘制一个立方体,但这与我的问题无关......
现在我的问题是从两部手机获取实时信息到我的计算机,然后计算所需的一切。我现在正在做的是在两部手机上使用一个名为 IP Webcam 的应用程序,该应用程序通过内部网发送两部相机的最后一张照片。
但问题是在互联网上以每秒 60 帧的速度加载两张图像效率非常低...(它适用于分辨率非常低的图像,但我希望图像具有更高的质量和细节)
然后我有了一个想法......我会制作一个移动应用程序,将相机的最后一帧保存在手机上的.png 中,然后计算机将访问后者。 (我什至不确定这是否可能 :) )我使用 Unity3d 是因为这似乎是一项简单的任务,并且不想为这么简单的事情学习 Android Studio...
我设法获取了相机源,但问题是我无法正确保存图像。经过大量研究,我仍然无法弄清楚该怎么做。将图像保存在哪里以便计算机可以访问?我尝试使用Application.persistantPath 将它保存在内部存储中,它可以工作(Android/data/com.myName.productName/files/savedImage.png),但我无法用我的计算机访问它(至少我没有设法;没有错误只是它没有加载图片,也许有可能......)。我用这段代码来保存它:
Texture2D tx2d = new Texture2D(backCam.width, backCam.height); //backCam is the last shot of the back camera, type = WebCamTexture
tx2d.SetPixels(backCam.GetPixels());
tx2d.Apply();
byte[] bytes = tx2d.EncodeToJPG();
Destroy(tx2d);
string path = Application.persistantPath; //This is the problem
File.WriteAllBytes(path + "/SavedScreen.png", bytes); //Save image
然后我尝试将其保存在 SD 卡上。但我不确定我的 SD 卡根路径是什么,也不知道如何找到它。我用这段代码找到了它:
public static string GetAndroidInternalFilesDir()
{
string[] potentialDirectories = new string[]
{
"/storage/sdcard0",
"/sdcard",
"/storage/sdcard1"
};
if (Application.platform == RuntimePlatform.Android)
{
for (int i = 0; i < potentialDirectories.Length; i++)
{
if (Directory.Exists(potentialDirectories[i]))
{
return potentialDirectories[i];
}
}
}
return "";
}
string path = GetAndroidInternalFilesDir() + "/Android/data/com.myName.ProductName/files/SavedScreen.png"
而且我没有收到任何错误。但是我在手机的文件系统或者电脑上都找不到保存的文件……
我做错了吗?我对 Android 不太了解(甚至可能一无所知),所以也许我在 Android 如何处理文件方面遗漏了一些东西?也许这完全是不可能的,所以我还想知道你是否知道我可以通过任何方式获得实时信息(或相机的最后一张照片),最好不是无线方式?
谢谢你,请随时在cmets中要求澄清,我真的被困在这里......
Ps:我有一个华为 Mate 10 lite
【问题讨论】:
标签: android image file unity3d