OpenCV + Android + Unity

问题描述 投票:9回答:2

我正在寻找一种在Unity项目中使用OpenCV的方法,而我的目标平台是Android设备。

我知道Unity资产商店中存在一些资产,但我不想使用它们,因为我发现它们太贵了。

通过使用this教程在dll中预编译OpenCV,我设法使用Unity中的opencv作为C ++本机插件,但dll意味着Windows桌面,因此它对我构建Android项目没有多大帮助。

我还发现了opencv jar存档,我知道它们可以很容易地导入Unity,但我不知道如何进行下一步:那就是如何从Unity C#脚本访问OpenCV。

因此,如果有人知道如何在Unity编辑器中使用OpenCV配置虚拟hello world项目以构建到Android,或者甚至有提示,我会接受任何关于此的信息。

提前致谢。

PS:我知道这个问题有点模糊,并且相信我这不是一个LMGFY问题,因为谷歌有很多这样的问题,没有真正的答案,所以请不要急于-1投票。

UPDATE

使用this教程,我设法使用Android studio为Android构建opencv,但我仍然不知道如何使用C#脚本中的OpenCV。例如,如何创建一个cv :: Mat?

所以我设法做了:

  • 构建OpenCV并使用Android studio运行一些本机代码(因此来自Java)。
  • 构建Unity native example(一个单独的C函数)并从C#脚本调用它。

但我仍然无法弄清楚如何使用OpenCV依赖项构建一些C ++代码并从C#脚本调用此代码。

c# android opencv unity3d unity5
2个回答
16
投票

所以我终于设法让它工作!!!!!!!!!! =)

我在这里发布它对我有用的方式。所以我设法做的是构建一个.so C ++库,其中包含与Visual Studio的OpenCV链接。在Unity中导入此库并构建一个非常简单的.so库中定义的Android应用程序调用函数。在Android手机上运行该应用。

使用的配置:

  • Unity 2017.2.0f2
  • Visual Studio 2017
  • 适用于Android的OpenCV 3.3.1。 opencv-3.3.1-android-sdk.zip可从OpenCV website下载。
  • Android智能手机:在联想Phab 2 Pro(谷歌探戈手机)和HTC 10上测试过

请注意,我将描述的步骤对我有用,但如果您的Android设备上有不同的CPU,则可能会有所不同(例如,您必须为ARM64而不是ARM构建,但事实是这些步骤是只是一个例子)。

我将假设您已经在计算机上安装了Android SDK,NDK和Unity,因此您已经能够使用Unity构建Android应用程序。

第1步:使用Visual Studio 2017创建C ++ Android库。

  • 文件>新建>项目

从左侧的下拉菜单转到模板> Visual C ++>跨平台> Android,然后选择“动态共享库(Android)”。 (您可能必须安装能够使用VS2017为Android构建的VS工具)。我将为此示例保留默认的“SharedObject1”名称。

New Project Selection

在“Solution platform”(Debug / Release下拉列表旁边)中选择“ARM”。我建议您构建版本,但在这里我们将坚持调试,因为工作流程完全相同。

enter image description here

第2步:将此C ++ Android项目与OpenCV for Android链接。

  • 在任何地方提取opencv-3.3.1-android-sdk.zip(选择并记住这个地方,因为你需要将文件保存在这个地方)。您应该有一个包含3个子文件夹的文件夹,名为“apk”,“samples”和“sdk”。
  • 在Visual Studio中,转到“项目”>“SharedObject1属性”。在配置中选择“所有配置”(因此它适用于Debug和Release),平台选择“ARM”。然后: 在C / C ++下,将OpenCV包含的FULL路径添加到“Additional Include Directories”。此路径为:C:\ Path-to-OpenCV-android-sdk \ sdk \ native \ jni \ include。 在Linker> General下,将OpenCV库的FULL路径添加到“Additional Library Directories”。此路径为:C:\ Path-to-OpenCV-android-sdk \ sdk \ native \ libs \ armeabi-v7a。 在Linker> Input下,将OpenCV库文件的FULL路径添加到“Additional Dependencies”。此路径为:C:\ Path-to-OpenCV-android-sdk \ sdk \ native \ libs \ armeabi-v7a \ libopencv_java3.so。

请注意,如果您知道如何设置环境变量,则可以使用环境变量而不是完整路径。我不会在这里解释。

第3步:为我们的库编写一些C ++ / OpenCV代码并构建它的时间

ShareObject1.h

extern "C"
{
    namespace SharedObject1
    {
        float Foopluginmethod();
    }
}

ShareObject1.cpp

#include "SharedObject1.h"
#include <opencv2\core.hpp> // use OpenCV in this C++ Android Library

extern "C" 
{
    float SharedObject1::Foopluginmethod()
    {
        cv::Mat img(10,10,CV_8UC1); // use some OpenCV objects
        return img.rows * 1.0f;     // should return 10.0f
    }
}

然后构建库:Build> Build Solution。如果您在此处遇到错误,例如“找不到文件blablabla”,请检查您是否在STEP 2中放置了完整路径或检查环境变量。如果您有其他错误,我不知道,请在评论中提问。

这应该在Path-to-your-VS-Project \ SharedObject1 \ ARM \ Debug(或Release)下生成一个libSharedObject1.so文件。

第四步:我们去Unity吧

  • 创建一个新的Unity项目并根据需要命名。
  • 创建一个新场景并保存。
  • 文件>构建设置。在Platform下选择Android并单击“Switch Platform”。
  • 单击“播放器设置”。在“其他设置”下,将包名称更改为您当前的感觉(Unity不喜欢默认值)。为设备筛选器选择“ARMv7”。
  • 将场景添加到构建中。

在场景中,选择主摄像头并向其添加名为“CallNativeCode”的新C#脚本:“添加组件”>键入“CallNativeCode”>“新建脚本”>“创建并添加”。在检查器中,在Clear Flags中选择“纯色”并选择深色(这仅用于快速演示)。

CallNativeCode.cs

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class CallNativeCode : MonoBehaviour
{    
    [DllImport("SharedObject1")]
    private static extern float Foopluginmethod();

    void OnGUI ()
    {
        // This Line should display "Foopluginmethod: 10"
        GUI.Label(new Rect(15, 125, 450, 100), "Foopluginmethod: " + Foopluginmethod());
    }
}

在Assets文件夹下,创建一个名为“Plugins”的子文件夹(拼写很重要),并在插件下创建一个名为“Android”的其他子文件夹。在此文件夹中,复制文件libSharedObject1.so和libopencv_java3.so(这两个文件的路径位于STEP 2和3中)。所以你应该有类似的东西:Unity Editor

在Unity Editor中选择libSharedObject1.so并检查在检查器中,所选插件的plaforms是否仅选中了Android,并且CPU是ARMv7。对libopencv_java3.so执行相同的操作。

现在,您可以在手机上构建和运行您的应用程序,并享受! ;-)

所以这只是一个虚拟应用程序,但它显示正确的短语,它的工作原理! =)这意味着我们设法让我们的Android Unity应用程序调用OpenCV C ++代码。关于更复杂的OpenCV C ++代码,嗯,这不是这里的主题,是时候让你的创造力流动了。

ScreenShot of what you should have


3
投票

这只是为了补充皮埃尔的答案,我想发表评论,但我没有足够的声誉。我使用最新版本的OpenCV(4.0.1)跟进了他的回答,还有一些我需要做的事情。

首先,用#include <opencv2/opencv.hpp>替换导入。另一个import语句指向旧代码。

然后转到项目的属性并选择C / C ++ - > Language。将语言标准设置为C ++ 11,并将“启用运行时类型信息”设置为“是”。

然后转到Code Generation并将Enable C ++ Exceptions设置为yes。

在那之后,你应该全力以赴。

© www.soinside.com 2019 - 2024. All rights reserved.