如何将Xamarin.android与OpenCV集成

时间:2019-05-12 03:48:32

标签: opencv xamarin.android

我试图在Visual Studio中将Xamarin.android与OpenCV连接起来,文档确实很差,有人可以为我提供一些操作步骤

1 个答案:

答案 0 :(得分:0)

在Xamarin.Android上使用OpenCV的方法不止一种:

1 -使用OpenCV4Android的绑定:OpenCV4Android是使用JNI的Android(Java)的OpenCV(C ++)的包装。有了绑定,我们在Java和C#之间有了一个接口(https://docs.microsoft.com/en-us/xamarin/android/platform/binding-java-library/中的更多信息)。

它是在https://github.com/jeremy-ellis-tech/Xamarin.Android.OpenCV中实现的,其中使用了OpenCV 3.1.0。 您可以按照安装说明和“减小.dll大小”生成一个dll并对其进行引用,也可以在Visual Studio解决方案中插入文件夹“ /src/OpenCV.Binding”的Visual Studio项目,并从您的项目到这个新项目。

如果要使用更新的版本,可以下载更新的OpenCV4Android版本(OpenCV SourceForge中名称为opencv-version-android-sdk.zip的文件,例如:链接https://sourceforge.net/projects/opencvlibrary/files/4.1.0/上的OpenCV4Android 4.1.0。 ),并用解压缩的OpenCV4Android的文件夹“ / sdk / native / libs”和“ / sdk / native / 3rdparty / libs”的内容替换先前项目中文件夹“ /src/OpenCV.Binding/Jars”的内容。 / p>

该项目的另一个分支是NuGet:https://www.nuget.org/packages/Xamarin.OpenCV.Droid,它可以简化安装和使用,但是我没有使用它,所以无法确定它是否有效。

由于此方法是OpenCV4Android的绑定,而不是纯粹的OpenCV,因此您将使用OpenCV4Android(https://opencv.org/android/)的文档。同样值得一提的是,这样,我们就有了3层编程语言(C#-Java-C ++),因此我们在方法调用方面会损失性能(JNI是负担)。因此,建议您使用尽可能少的呼叫。

2 -使用OpenCV C ++包装器:通过这种方式,我们将使用C ++共享库(.so),并从C#(https://docs.microsoft.com/en-us/xamarin/android/platform/native-libraries)中调用其方法。 为此,我们需要编写OpenCV方法的PInvoke,这很多,这意味着很多时间。因此,我们将使用别人已经制造的东西。

我们有OpenCvSharp,它是OpenCV到.NET的包装,并且显然运行良好。问题:它与ARM不兼容,因此无法在智能手机上运行。 但是,一个好人修改了它使其可以在ARM设备上运行:https://github.com/Kawaian/OpenCvSharp

如何快速使用它:您在解决方案中插入文件夹“ / src / OpenCvSharp”的项目并对其进行引用。您将“ /src/OpenCvSharp.Android/Native”的内容复制到项目的“ lib”或“ libs”文件夹中。比将“ .so”文件配置为“始终复制”到目录外,然后将其构建操作配置为“ AndroidNativeLibrary”(如果您的项目是应用程序)或“嵌入式本机库”(如果您的项目是Android库)。

其他方法是安装NuGet(https://www.nuget.org/packages/Kawaian.OpenCVSharp/),这使操作变得容易一些,但是还需要将“ .so”文件复制到“ lib”或“ libs”并进行配置

此包装器使用OpenCV 3.2.0。我正在研究在此项目上更新OpenCV版本的方法,但目前它可以工作。

这种方法的最大优点是性能(比较两种方法的实现时,我的应用程序的性能提高了约30%),但是唯一的缺点是缺少现成的Android.Bitmap-OpenCV.Mat转换方法。 / p>