Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于原生OpenCV的unity Android应用_C#_Android_C++_Opencv_Unity3d - Fatal编程技术网

C# 基于原生OpenCV的unity Android应用

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(“国家原则”)

我有点怀疑,希望你能解决它

我想在unity中创建一个android应用程序。该应用程序包括激活设备的摄像头并在屏幕上查看。为此,我希望基于基于OpenCV的本机C++代码

我有生成的代码,但当我运行应用程序时,我看到的是场景,而不是图像,我感觉这是因为OpenCV的视频捕获功能我没有在android上很好地使用它。你能帮我附上代码吗

C++:

C#:

公共类卡马拉:单一行为{
[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类,但几乎可能这个抓取的纹理是空的,因此您可以看到图像中的黑屏

您是否尝试为opencv搜索unity插件? 我唯一看到的是这个(不是免费的):

如果这不起作用,您有没有办法粘贴unity项目的java代码?因为java中的摄像头捕获要容易得多。 希望这些线索对你有所帮助

昂多·伊桑·埃塔·阿尼莫


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);
}