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依赖项构建一些C++代码并从C#脚本调用此代码.
Pie*_*ret 18
所以我终于设法让它工作!!!!!!!!!! =)
我在这里发布它对我有用的方式.所以我设法做的是构建一个.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();
}
}
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吧
在场景中,选择主摄像头并向其添加名为"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.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>. 另一个导入语句指向旧代码。
然后转到项目的属性并选择 C/C++->Language。将语言标准设置为 C++ 11 并将启用运行时类型信息设置为是。
然后转到代码生成并将启用 C++ 异常设置为是。
在那之后,你应该一切都准备好了。