我正在寻找一种在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依赖项构建一些C ++代码并从C#脚本调用此代码。
所以我终于设法让它工作!!!!!!!!!! =)
我在这里发布它对我有用的方式。所以我设法做的是构建一个.so C ++库,其中包含与Visual Studio的OpenCV链接。在Unity中导入此库并构建一个非常简单的.so库中定义的Android应用程序调用函数。在Android手机上运行该应用。
使用的配置:
请注意,我将描述的步骤对我有用,但如果您的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链接。
请注意,如果您知道如何设置环境变量,则可以使用环境变量而不是完整路径。我不会在这里解释。
第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吧
在场景中,选择主摄像头并向其添加名为“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中选择libSharedObject1.so并检查在检查器中,所选插件的plaforms是否仅选中了Android,并且CPU是ARMv7。对libopencv_java3.so执行相同的操作。
现在,您可以在手机上构建和运行您的应用程序,并享受! ;-)
所以这只是一个虚拟应用程序,但它显示正确的短语,它的工作原理! =)这意味着我们设法让我们的Android Unity应用程序调用OpenCV C ++代码。关于更复杂的OpenCV C ++代码,嗯,这不是这里的主题,是时候让你的创造力流动了。
这只是为了补充皮埃尔的答案,我想发表评论,但我没有足够的声誉。我使用最新版本的OpenCV(4.0.1)跟进了他的回答,还有一些我需要做的事情。
首先,用#include <opencv2/opencv.hpp>
替换导入。另一个import语句指向旧代码。
然后转到项目的属性并选择C / C ++ - > Language。将语言标准设置为C ++ 11,并将“启用运行时类型信息”设置为“是”。
然后转到Code Generation并将Enable C ++ Exceptions设置为yes。
在那之后,你应该全力以赴。