OpenCV + Android + Unity

Pie*_*ret 9 c# android opencv unity-game-engine unity5

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

我知道有些资产存在于统一资产仓库,但我不要想,因为我觉得他们太昂贵,使用它们.

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

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

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

提前致谢.

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

UPDATE

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

所以我设法做了:

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

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

Pie*_*ret 18

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

我在这里发布它对我有用的方式.所以我设法做的是构建一个.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网站下载.
  • Android智能手机:在联想Phab 2 Pro(谷歌Tango手机)和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"名称.

新项目选择

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

在此输入图像描述

第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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

第四步:我们去Unity吧

  • 创建一个新的Unity项目并根据需要命名.
  • 创建一个新场景并保存.
  • 文件>构建设置.在Platform下选择Android并单击"Switch Plateform".
  • 单击"播放器设置".在"其他设置"下,将包名称更改为您当前的感觉(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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

ScreenShot你应该拥有什么


Nin*_*494 6

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

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

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

然后转到代码生成并将启用 C++ 异常设置为是。

在那之后,你应该一切都准备好了。