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