C# 基于原生OpenCV的unity Android应用
我有点怀疑,希望你能解决它 我想在unity中创建一个android应用程序。该应用程序包括激活设备的摄像头并在屏幕上查看。为此,我希望基于基于OpenCV的本机C++代码 我有生成的代码,但当我运行应用程序时,我看到的是场景,而不是图像,我感觉这是因为OpenCV的视频捕获功能我没有在android上很好地使用它。你能帮我附上代码吗 C++: C#:C# 基于原生OpenCV的unity Android应用,c#,android,c++,opencv,unity3d,C#,Android,C++,Opencv,Unity3d,我有点怀疑,希望你能解决它 我想在unity中创建一个android应用程序。该应用程序包括激活设备的摄像头并在屏幕上查看。为此,我希望基于基于OpenCV的本机C++代码 我有生成的代码,但当我运行应用程序时,我看到的是场景,而不是图像,我感觉这是因为OpenCV的视频捕获功能我没有在android上很好地使用它。你能帮我附上代码吗 C++: C#: 公共类卡马拉:单一行为{ [DllImport(“国家原则”)] 公共静态外部无效视频(字节[]img); [DllImport(“国家原则”)
公共类卡马拉:单一行为{
[DllImport(“国家原则”)]
公共静态外部无效视频(字节[]img);
[DllImport(“国家原则”)]
公共静态外部空隙(参考内部宽度,参考内部高度);
网络摄像机;
纹理2d纹理;
字节[]imgData;
整数宽度=0;
整数高度=0;
//用于初始化
无效开始(){
后退=新的WebCamTexture();
//GetComponent().material.mainTexture=返回;
//返回。播放();
iniciar(参考宽度、参考高度);
}
//每帧调用一次更新
无效更新()
{
imgData=新字节[宽度*高度*4];
视频(imgData);
TextureA=新的Texture2D(宽度、高度、TextureFormat.RGB24,假);
纹理。加载纹理数据(imgData);
textura.Apply();
GetComponent().material.mainTexture=textura;
imgData=null;
textura=null;
}}
如果您已经在GitHub上托管了全部代码,或者您可以创建一个要点,那么效果会更好
但是,我认为你的相机是空的
我将试图列举为什么会发生这种情况
- 首先,opencv视频捕获类camera.open(0)在没有ffmpeg的情况下无法工作(对于android本机来说,交叉编译并不容易)
如果你想在Android中使用C++中的本地摄像头,你需要使用API 24的最新NDK。李> - 我看到您正在使用Unity的WebCamTexture类,但几乎可能这个抓取的纹理是空的,因此您可以看到图像中的黑屏
Unai。盯着你的代码看了几分钟后,我发现你的代码中有几个错误 < C++ >强>>1 < /强>。您在C++侧使用了<代码> CORLYBGR2RGB 。 <>强> 2 。如果要修改C++插件内部的C数组,必须将其插入内存中。修改后,可以取消绑定。如果你不这样做,你会遇到一个错误,你将永远找不到 使用
fixed
关键字锁定数组,然后将其强制转换为IntPtr
,并将其作为IntPtr
传递给视频函数。最好也传入数组大小,这样就不会使用不存在的索引
大概是这样的:
[DllImport("NativoPrincipio")]
public static extern void video(IntPtr img, int count);
<> > 3 > <强>。最后,这是可选的,但是你可能想用java来读取相机的图像,然后用C++把图像传递给OpenCV。我见过很多人在使用OpenCV阅读相机时遇到问题,更不用说速度也很慢
imgData=新字节[宽度*高度*4]代码>为什么要乘以4?你的相机提供4通道图像吗?因为是RGB图像,我试着放3通道,但失败了。所以我把4个通道RGB
表示3个通道。如果你的代码失败了,那是因为其他原因。正如@uelordi所建议的,尝试使用Java本机代码捕获图像,只使用OpenCV处理图像。
public class camara : MonoBehaviour {
[DllImport("NativoPrincipio")]
public static extern void video(byte[] img);
[DllImport("NativoPrincipio")]
public static extern void iniciar(ref int widt, ref int heigh);
WebCamTexture back;
Texture2D textura;
byte[] imgData;
int width = 0;
int height = 0;
// Use this for initialization
void Start () {
back = new WebCamTexture();
//GetComponent<Renderer>().material.mainTexture = back;
//back.Play();
iniciar(ref width, ref height);
}
// Update is called once per frame
void Update ()
{
imgData = new byte[width * height * 4];
video(imgData);
textura = new Texture2D(width, height, TextureFormat.RGB24, false);
textura.LoadRawTextureData(imgData);
textura.Apply();
GetComponent<Renderer>().material.mainTexture = textura;
imgData = null;
textura = null;
}}
[DllImport("NativoPrincipio")]
public static extern void video(IntPtr img, int count);
//Pin Memory
fixed (byte* p = imgData)
{
video((IntPtr)p, imgData.Length);
}