OpenCV + 安卓 + Unity [英] OpenCV + Android + Unity

查看:64
本文介绍了OpenCV + 安卓 + Unity的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我知道 Unity 资产商店中存在一些资产,但我不想想要使用它们,因为我觉得它们太贵了.

通过使用

在解决方案平台"中(在调试/发布下拉菜单旁边)选择ARM".我建议您在发布中构建,但在这里我们将坚持调试,因为工作流程完全相同.

第 2 步:将此 C++ Android 项目与适用于 Android 的 OpenCV 相关联.

  • opencv-3.3.1-android-sdk.zip 提取到任何您想要的位置(选择并记住该位置,因为您需要将文件保存在该位置).您应该有一个包含 3 个子文件夹的文件夹,名为apk"、samples"和sdk".
  • 在 Visual Studio 中,转到项目 > SharedObject1 属性.在配置中选择所有配置"(因此它适用于调试和发布),平台选择ARM".然后:
    • 在 C/C++ 下,将 OpenCV 包含的完整路径添加到附加包含目录".这个路径是:C:Path-to-OpenCV-android-sdksdk ativejniinclude.
    • 在链接器 > 常规下,将 OpenCV 库的完整路径添加到附加库目录".此路径为:C:Path-to-OpenCV-android-sdksdk ativelibsarmeabi-v7a.
    • 在链接器 > 输入下,将 OpenCV 库文件的完整路径添加到附加依赖项".这个路径是:C:Path-to-OpenCV-android-sdksdk ativelibsarmeabi-v7alibopencv_java3.so.

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

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

ShareObject1.h

extern "C"{命名空间 SharedObject1{浮动 Foopluginmethod();}}

ShareObject1.cpp

#include "SharedObject1.h"#include //在这个 C++ Android 库中使用 OpenCV外部C"{float SharedObject1::Foopluginmethod(){cv::Mat img(10,10,CV_8UC1);//使用一些 OpenCV 对象返回 img.rows * 1.0f;//应该返回 10.0f}}

然后构建库:构建>构建解决方案.如果您在此处遇到诸如未找到文件 blablabla"之类的错误,请检查您是否在第 2 步中放置了完整路径或检查您的环境变量.如果您还有其他错误,我不知道,请在评论中提问.

这应该会在 Path-to-your-VS-ProjectSharedObject1ARMDebug(或 Release)下生成一个 libSharedObject1.so 文件.

第 4 步:让我们进入 Unity

  • 创建一个新的 Unity 项目并根据需要为其命名.
  • 创建一个新场景并保存.
  • 文件 > 构建设置.在平台下选择 Android,然后点击切换平台".
  • 点击播放器设置.在其他设置"下,将包名称更改为您目前的感觉(Unity 不喜欢默认值).为设备过滤器选择ARMv7".
  • 将您的场景添加到构建中.

在您的场景中,选择主摄像机并向其添加一个名为CallNativeCode"的新 C# 脚本:添加组件"> 键入CallNativeCode"> 新脚本> 创建并添加.在检查器中,在清除标志中选择纯色"并添加深色(这仅用于快速演示).

CallNativeCode.cs

使用UnityEngine;使用 System.Collections;使用 System.Runtime.InteropServices;公共类 CallNativeCode : MonoBehaviour{[DllImport("SharedObject1")]私有静态外部浮动 Foopluginmethod();void OnGUI (){//此行应显示Foopluginmethod: 10"GUI.Label(new Rect(15, 125, 450, 100), "Foopluginmethod: " + Foopluginmethod());}}

在Assets文件夹下,创建一个名为Plugins"的子文件夹(拼写很重要),在Plugins下创建一个名为Android"的子文件夹.在此文件夹中,复制文件 libSharedObject1.solibopencv_java3.so(这两个文件的路径在第 2 步和第 3 步中).所以你应该有这样的东西:

在 Unity Editor 中选择 libSharedObject1.so 并在检查器中检查 Selected plaforms for plugin 是否只选中了 Android,并且 CPU 是 ARMv7.对 libopencv_java3.so 执行相同操作.

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

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

I am looking for a way to use OpenCV in a Unity project and my target platform is an Android device.

I know that some assets exists on Unity asset store but I DO NOT want to use them as I find them way too expensive.

I manage to use use opencv in Unity as a C++ native pluggins by precompiling OpenCV in dlls using this tutorial, but dll means Windows Desktop so it doesn't help me much to build my project for Android.

I also found opencv jar archive, I know they can be easily imported into Unity, but I don't know how to do the next step: that is how to access OpenCV stuff from Unity C# scripts.

So, if anyone knows how to configure even a dummy hello world project using OpenCV in Unity editor for build to Android, or even has hints, I would take any infos about that.

Thanks in advance.

PS: I know this question is some sort of vague, and trust me it is not a LMGFY question as on google there is a lot of question like this and no real answer, so please don't rush -1 vote.

UPDATE

Using this tutorial, I managed to build opencv for Android using Android studio, but still I don't know how to use OpenCV from C# scripting. For example, how to create a cv::Mat?

So what I managed to do:

  • Build OpenCV and run some native code using Android studio (so from Java).
  • Build the Unity native example (one single C function) and call it from a C#script.

But I still can't figure out how to build some C++ code with OpenCV dependencies and call this code from a C# script.

解决方案

So I finally managed to get it work !!!!!!!!!! =)

I am posting the way it worked for me here. So what I managed to do is build an .so C++ library with link to OpenCV with Visual Studio. Import this library in Unity and build a very simple Android application calling function defined in the .so library. Run the app on an Android phone.

Configuration used:

  • Unity 2017.2.0f2
  • Visual Studio 2017
  • OpenCV 3.3.1 for Android. opencv-3.3.1-android-sdk.zip downloadable from OpenCV website.
  • Android smartphone : tested on Lenovo Phab 2 Pro (Google Tango Phone) and HTC 10

Note that the steps I will describe worked for me but it might be different for you if you have a different CPU on your Android device (you'll have to build for ARM64 instead of ARM for instance, but the truth is that these steps are just an example).

I will assume that you already have Android SDK, NDK and Unity installed on your computer, so and that you are already able to build android app with Unity.

STEP 1: create a C++ Android Library with visual Studio 2017.

  • File > New > Project

From the Dropdown menu on the left go to Templates > Visual C++ > Cross Platform > Android, and select "Dynamic Shared Library (Android)". (You might have to install the VS tools the be able to build for Android with VS2017). I'll keep the default "SharedObject1" name for this example.

In "Solution platform" (next to Debug/Release dropdown) select "ARM". I suggest you build in release but here we'll stick in debug as the workflow is exactly the same.

STEP 2: Link this C++ Android Project with OpenCV for Android.

  • Extract opencv-3.3.1-android-sdk.zip wherever you want (choose and remember the place nevertheless because you'll need to keep the files in this place). You should have a folder with 3 subfolders called "apk", "samples" and "sdk".
  • In Visual Studio, go to Project > SharedObject1 Properties. In configuration choose "All configurations" (so it applies in both Debug and Release), and platform choose "ARM". Then:
    • Under C/C++, add the FULL path to OpenCV's includes to "Additional Include Directories". This path is: C:Path-to-OpenCV-android-sdksdk ativejniinclude.
    • Under Linker > General, add the FULL path to OpenCV's libraries to "Additional Library Directories". This path is: C:Path-to-OpenCV-android-sdksdk ativelibsarmeabi-v7a.
    • Under Linker > Input, add the FULL path to OpenCV's libraries file to "Additional Dependencies". This path is: C:Path-to-OpenCV-android-sdksdk ativelibsarmeabi-v7alibopencv_java3.so.

Note that instead of the full path, you can use environment variable if you know how to set them. I won't explain that here.

STEP 3: Time to write some C++/OpenCV code for our library and build it

ShareObject1.h

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

ShareObject1.cpp

#include "SharedObject1.h"
#include <opencv2core.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
    }
}

Then build the library: Build > Build Solution. If you have errors here like "Files not found blablabla", check that you put the full paths in STEP 2 or check your environment variables. If you have other errors, I don't know, ask in comments.

This should have generated a libSharedObject1.so file under Path-to-your-VS-ProjectSharedObject1ARMDebug (or Release).

STEP 4: Let's go to Unity

  • Create a new Unity Project and name it like you want.
  • Create a new Scene and save it.
  • File > Build Settings. Under Platform select Android and click "Switch Plateform".
  • Click on Player Settings. Under "Other Settings", change the Package Name to what you feel like at the moment (Unity doesn't like the default value). Select "ARMv7" for Device Filter.
  • Add your scene to the build.

In your scene, select the Main Camera and add a new C# Script named "CallNativeCode" to it: "Add Component" > type "CallNativeCode" > New Script > Create And Add. In the inspector, in Clear Flags choose "Solid color" and put a dark color (this is just for the quick demo).

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

Under the Assets folder, create a subfolder called "Plugins" (the spelling is important), and an other sub folder under Plugins called "Android". In this folder, copy the files libSharedObject1.so and libopencv_java3.so (the paths to these two files is in STEP 2 and 3). So you should have something like that :

Select libSharedObject1.so in Unity Editor and check that in the inspector the Selected plaforms for plugin has only Android checked, and that the CPU is ARMv7. Do the same for libopencv_java3.so.

Now you can Build and Run your app on a phone, and enjoy ! ;-)

So this is just a dummy application, but it displays the right phrase, it works !!! =) That means that we managed to make our Android Unity app call OpenCV C++ code. Regarding more complex OpenCV C++ code, well, this is not the topic here, it's time to let your creativity flow.

这篇关于OpenCV + 安卓 + Unity的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆