为基于xamarin的Android APP添加OpenCV库

  1. 下载C# bindings for the OpenCV Android SDK ,注意默认是3.1.0,分支中有OpenCV2.4.11版本。
  2. 打开解决方案src\Xamarin.Android.OpenCV.sln
  3. 将OpenCV.Binding设为活动项目
  4. 选择CPU平台和debug/release版本。其中Any CPU是全平台支持的版本,生成的dll最大。None表示不在编译生成的文件中添加私有库,此时需要在Android平台上安装OpenCVManager。在一部手机上安装多个基于OpenCV的程序时,使用None配置可大幅减小应用体积。
    如果想要在模拟器中调试程序,可以选择x86平台。
  5. 编译,在对应文件夹下得到dll文件。在另一个xamarin Android项目中,引用这个dll文件即可。

使用方法。

引用相关命名空间。

using OpenCV.Android;
using OpenCV.Core;
using OpenCV.ImgProc;
//……

加载OpenCV模块

建议在OnCreate、OnResume或构造函数中加载OpenCV模块


BaseLoaderCallback callback = new Callback(this);
if (!OpenCVLoader.InitAsync(OpenCVLoader.OpencvVersion2410, this, callback))
{
	//或抛出异常
	Toast.MakeText(this, "OpenCV;连接失败", ToastLength.Long);
}

在模块加载完成之前,无法使用任何OpenCV模块。
然后就可以用熟悉的方式使用OpenCV了。
以下是截图,导入到Mat对象,显示到界面的ImageView,最后再保存成png图片的代码。截图需要root权限。

private void Cap_Click(object sender, EventArgs e)
{
	var builder = new ProcessBuilder("su", "-c", "screencap");
	var process = builder.Start();
	using (var outputStreamReader = new StreamReader(process.InputStream))
	{
	var ms = new MemoryStream();
	outputStreamReader.BaseStream.CopyTo(ms);
	byte[] outBytes = ms.ToArray();
	int width = BitConverter.ToInt32(outBytes, 0);
	int height = BitConverter.ToInt32(outBytes, 4);
	Mat img = new Mat(height, width, CvType.Cv8uc4);
	System.Runtime.InteropServices.Marshal.Copy(outBytes, 12, (IntPtr)img.DataAddr(), height * width * 4);
	Bitmap bitmap= Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888);
	Utils.MatToBitmap(img, bitmap);
	Utils.BitmapToMat(bitmap, img);
	capImage.SetImageBitmap(bitmap);
	SaveBitmapAsPNG(bitmap,"storage/emulated/legacy/pictures/img.png");
	}
}

你可能感兴趣的:(Android学习笔记)