基于本机openCV的统一申请

Android application on unity based on native OpenCV

本文关键字:于本机 openCV      更新时间:2023-10-16

我很疑问,我希望您可以解决它。

我想以Unity创建一个Android应用程序。该应用程序包括激活设备的相机并在屏幕上查看。为此,我想基于基于OpenCV的本机C 代码。

我有生成的代码,但是当我运行应用程序时,我会看到场景,但没有看到图像,并且我有感觉是因为OpenCV的视频关注功能我对Android的使用不佳。你能帮我我附加代码:

c :

__declspec(dllexport) void iniciar(int& widt, int& heigh) {
camera.open(0);
if (!camera.isOpened())
{
    return;
}
widt = (int)camera.get(CV_CAP_PROP_FRAME_WIDTH);
heigh = (int)camera.get(CV_CAP_PROP_FRAME_HEIGHT);
trueRect.x = 5;
trueRect.y = 5;
trueRect.width = 100;
trueRect.height = 100;
midX = 1;
midY = 1;
wi = 0;
he = 0;
}

__declspec(dllexport)
void video(unsigned char* arr) {
Mat frame;
Mat resi;
Mat dst;//dst image
camera >> frame;
if (frame.empty()) {
    return;
}
flip(frame, dst,1);
//resize(dst, resi, Size(width, height));
cv::cvtColor(dst, dst, COLOR_BGR2RGB);
copy(dst.datastart, dst.dataend, arr);
}

c#:

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

如果您在github上托管了整个代码,或者可以创建要点会更好。

,但是,我认为您的相机框架是空的。

我将尝试枚举为什么会发生这种情况。

  • 首先,openCV视频捕获类 camera.open(0)没有FFMPEG(对于Android Native来说都不容易交叉跨秒)。

    • 如果您想在Android中使用C 中的本机摄像机,则需要使用API 24的最新NDK。
  • 我看到您正在使用Unity的WebCamtexture类,但是几乎可能是抓取的纹理是空的,因此您在图像中看到了黑屏。

您是否尝试搜索openCV的Unity插件?我唯一看到的是(不是免费的): https://www.assetstore.unity3d.com/en/#!/content/21088

如果这不起作用,您是否可以将Java代码粘贴到Unity Projects?因为在Java中捕获相机要容易得多。希望这些线索对您有所帮助。

Ondo Izan Eta Animo。

unai。

盯着您的代码几分钟后,我发现了您的代码中的几个错误。

1 。您在C 方面使用了COLOR_BGR2RGB。这应该是COLOR_BGR2BGRA,因为您在C#方面使用TextureFormat.RGB24

2 。如果要修改C 插件内的C#数组,则必须将其固定在内存中。修改后,您可以取消它。如果您不这样做,您将遇到一个错误的错误。

使用fixed关键字固定数组,然后将其施加到IntPtr,然后将其传递给视频功能,为IntPtr。也要传递数组大小总是一个好主意,这样您就不会使用不存在的索引。

类似的东西:

[DllImport("NativoPrincipio")]
public static extern void video(IntPtr img, int count);

...

//Pin Memory
fixed (byte* p = imgData)
{
    video((IntPtr)p, imgData.Length);
}

3 。本文是可选的,但是您可能需要使用Java读取相机中的图像,然后使用C 传递图像。我看到许多人通过使用OpenCV从相机中读取问题而遇到问题,更不用说它也很慢了。