bool CheckCascadeFile(String face, String eye, out String faceFile, out String eyeFile) { #if __ANDROID__ ISharedPreferences preference = PreferenceManager.GetDefaultSharedPreferences(Android.App.Application.Context); String appVersion = Android.App.Application.Context.PackageManager.GetPackageInfo(Android.App.Application.Context.PackageName, Android.Content.PM.PackageInfoFlags.Activities).VersionName; if (!preference.Contains("cascade-data-version") || !preference.GetString("cascade-data-version", null).Equals(appVersion) || !(preference.Contains("cascade-eye-data-path") || preference.Contains("cascade-face-data-path"))) { AndroidFileAsset.OverwriteMethod overwriteMethod = AndroidFileAsset.OverwriteMethod.AlwaysOverwrite; FileInfo eyeFileTmp = AndroidFileAsset.WritePermanantFileAsset(Android.App.Application.Context, eye, "cascade", overwriteMethod); FileInfo faceFileTmp = AndroidFileAsset.WritePermanantFileAsset(Android.App.Application.Context, face, "cascade", overwriteMethod); //save data path ISharedPreferencesEditor editor = preference.Edit(); editor.PutString("cascade-data-version", appVersion); editor.PutString("cascade-eye-data-path", eyeFileTmp.FullName); editor.PutString("cascade-face-data-path", faceFileTmp.FullName); editor.Commit(); } eyeFile = preference.GetString("cascade-eye-data-path", null); faceFile = preference.GetString("cascade-face-data-path", null); return(File.Exists(eyeFile) && File.Exists(faceFile)); #else faceFile = face; eyeFile = eye; return(true); #endif }
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); OnButtonClick += delegate { AppPreference appPreference = new AppPreference(); using (Image <Bgr, Byte> image = PickImage("lena.jpg")) { ISharedPreferences preference = PreferenceManager.GetDefaultSharedPreferences(ApplicationContext); String appVersion = PackageManager.GetPackageInfo(PackageName, Android.Content.PM.PackageInfoFlags.Activities).VersionName; if (!preference.Contains("cascade-data-version") || !preference.GetString("cascade-data-version", null).Equals(appVersion) || !(preference.Contains("cascade-eye-data-path") || preference.Contains("cascade-face-data-path"))) { AndroidFileAsset.OverwriteMethod overwriteMethod = AndroidFileAsset.OverwriteMethod.AlwaysOverwrite; FileInfo eyeFile = AndroidFileAsset.WritePermanantFileAsset(this, "haarcascade_eye.xml", "cascade", overwriteMethod); FileInfo faceFile = AndroidFileAsset.WritePermanantFileAsset(this, "haarcascade_frontalface_default.xml", "cascade", overwriteMethod); //save tesseract data path ISharedPreferencesEditor editor = preference.Edit(); editor.PutString("cascade-data-version", appVersion); editor.PutString("cascade-eye-data-path", eyeFile.FullName); editor.PutString("cascade-face-data-path", faceFile.FullName); editor.Commit(); } string eyeXml = preference.GetString("cascade-eye-data-path", null); string faceXml = preference.GetString("cascade-face-data-path", null); long time; List <Rectangle> faces = new List <Rectangle>(); List <Rectangle> eyes = new List <Rectangle>(); bool tryUseOpenCL = appPreference.UseOpenCL; DetectFace.Detect(image.Mat, faceXml, eyeXml, faces, eyes, false, tryUseOpenCL, out time); SetMessage(String.Format("Detected with {1} in {0} milliseconds.", time, CvInvoke.UseOpenCL ? "OpenCL" : "CPU")); foreach (Rectangle rect in faces) { image.Draw(rect, new Bgr(System.Drawing.Color.Red), 2); } foreach (Rectangle rect in eyes) { image.Draw(rect, new Bgr(System.Drawing.Color.Blue), 2); } SetImageBitmap(image.ToBitmap()); } }; }
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); OnImagePicked += (sender, image) => { if (image == null) { return; } AppPreference appPreference = new AppPreference(); CvInvoke.UseOpenCL = appPreference.UseOpenCL; String oclDeviceName = appPreference.OpenClDeviceName; if (!String.IsNullOrEmpty(oclDeviceName)) { CvInvoke.OclSetDefaultDevice(oclDeviceName); } ISharedPreferences preference = PreferenceManager.GetDefaultSharedPreferences(ApplicationContext); String appVersion = PackageManager.GetPackageInfo(PackageName, Android.Content.PM.PackageInfoFlags.Activities).VersionName; if (!preference.Contains("cascade-data-version") || !preference.GetString("cascade-data-version", null).Equals(appVersion) || !(preference.Contains("cascade-eye-data-path") || preference.Contains("cascade-face-data-path"))) { AndroidFileAsset.OverwriteMethod overwriteMethod = AndroidFileAsset.OverwriteMethod.AlwaysOverwrite; FileInfo eyeFile = AndroidFileAsset.WritePermanantFileAsset(this, "haarcascade_eye.xml", "cascade", overwriteMethod); FileInfo faceFile = AndroidFileAsset.WritePermanantFileAsset(this, "haarcascade_frontalface_default.xml", "cascade", overwriteMethod); //save tesseract data path ISharedPreferencesEditor editor = preference.Edit(); editor.PutString("cascade-data-version", appVersion); editor.PutString("cascade-eye-data-path", eyeFile.FullName); editor.PutString("cascade-face-data-path", faceFile.FullName); editor.Commit(); } string eyeXml = preference.GetString("cascade-eye-data-path", null); string faceXml = preference.GetString("cascade-face-data-path", null); long time; List <Rectangle> faces = new List <Rectangle>(); List <Rectangle> eyes = new List <Rectangle>(); DetectFace.Detect(image, faceXml, eyeXml, faces, eyes, out time); String computeDevice = CvInvoke.UseOpenCL ? "OpenCL: " + Emgu.CV.Ocl.Device.Default.Name : "CPU"; SetMessage(String.Format("Detected with {1} in {0} milliseconds.", time, computeDevice)); foreach (Rectangle rect in faces) { CvInvoke.Rectangle(image, rect, new Bgr(System.Drawing.Color.Red).MCvScalar, 2); } foreach (Rectangle rect in eyes) { CvInvoke.Rectangle(image, rect, new Bgr(System.Drawing.Color.Blue).MCvScalar, 2); } SetImageBitmap(image.ToBitmap()); image.Dispose(); if (CvInvoke.UseOpenCL) { CvInvoke.OclFinish(); } }; OnButtonClick += (sender, args) => { PickImage("lena.jpg"); }; }
public static string LoadFile(string assetName) { AndroidFileAsset.OverwriteMethod method = AndroidFileAsset.OverwriteMethod.AlwaysOverwrite; System.IO.FileInfo fi = AndroidFileAsset.WritePermanantFileAsset(Context, assetName, "assetCache", method); return(fi.FullName); }
public DnnPage() : base() { var button = this.GetButton(); button.Text = "Perform Mask-rcnn Detection"; button.Clicked += OnButtonClicked; OnImagesLoaded += async(sender, image) => { if (image == null || image[0] == null) { return; } SetMessage("Please wait..."); SetImage(null); Task <Tuple <Mat, String, long> > t = new Task <Tuple <Mat, String, long> >( () => { String configFile = "mask_rcnn_inception_v2_coco_2018_01_28.pbtxt"; #if __ANDROID__ String path = System.IO.Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads, "dnn_data"); FileInfo configFileInfo = AndroidFileAsset.WritePermanantFileAsset(Android.App.Application.Context, configFile, "dnn_data", AndroidFileAsset.OverwriteMethod.AlwaysOverwrite); configFile = configFileInfo.FullName; #else String path = "./dnn_data/"; #endif String graphFile = DnnDownloadFile(path, "frozen_inference_graph.pb"); String lookupFile = DnnDownloadFile(path, "coco-labels-paper.txt"); string[] labels = File.ReadAllLines(lookupFile); Emgu.CV.Dnn.Net net = Emgu.CV.Dnn.DnnInvoke.ReadNetFromTensorflow(graphFile, configFile); Mat blob = DnnInvoke.BlobFromImage(image[0]); net.SetInput(blob, "image_tensor"); using (VectorOfMat tensors = new VectorOfMat()) { net.Forward(tensors, new string[] { "detection_out_final", "detection_masks" }); using (Mat boxes = tensors[0]) using (Mat masks = tensors[1]) { System.Drawing.Size imgSize = image[0].Size; float[,,,] boxesData = boxes.GetData(true) as float[, , , ]; //float[,,,] masksData = masks.GetData(true) as float[,,,]; int numDetections = boxesData.GetLength(2); for (int i = 0; i < numDetections; i++) { float score = boxesData[0, 0, i, 2]; if (score > 0.5) { int classId = (int)boxesData[0, 0, i, 1]; String label = labels[classId]; float left = boxesData[0, 0, i, 3] * imgSize.Width; float top = boxesData[0, 0, i, 4] * imgSize.Height; float right = boxesData[0, 0, i, 5] * imgSize.Width; float bottom = boxesData[0, 0, i, 6] * imgSize.Height; RectangleF rectF = new RectangleF(left, top, right - left, bottom - top); Rectangle rect = Rectangle.Round(rectF); rect.Intersect(new Rectangle(Point.Empty, imgSize)); CvInvoke.Rectangle(image[0], rect, new MCvScalar(0, 0, 0, 0), 1); CvInvoke.PutText(image[0], label, rect.Location, FontFace.HersheyComplex, 1.0, new MCvScalar(0, 0, 255), 2); int[] masksDim = masks.SizeOfDimension; using (Mat mask = new Mat( masksDim[2], masksDim[3], DepthType.Cv32F, 1, //masks.DataPointer + //(i * masksDim[1] + classId ) //* masksDim[2] * masksDim[3] * masks.ElementSize, masks.GetDataPointer(i, classId), masksDim[3] * masks.ElementSize)) using (Mat maskLarge = new Mat()) using (Mat maskLargeInv = new Mat()) using (Mat subRegion = new Mat(image[0], rect)) using (Mat largeColor = new Mat(subRegion.Size, Emgu.CV.CvEnum.DepthType.Cv8U, 3)) { CvInvoke.Resize(mask, maskLarge, rect.Size); //give the mask at least 30% transparency using (ScalarArray sa = new ScalarArray(0.7)) CvInvoke.Min(sa, maskLarge, maskLarge); //Create the inverse mask for the original image using (ScalarArray sa = new ScalarArray(1.0)) CvInvoke.Subtract(sa, maskLarge, maskLargeInv); //The mask color largeColor.SetTo(new Emgu.CV.Structure.MCvScalar(255, 0, 0)); if (subRegion.NumberOfChannels == 4) { using (Mat bgrSubRegion = new Mat()) { CvInvoke.CvtColor(subRegion, bgrSubRegion, ColorConversion.Bgra2Bgr); CvInvoke.BlendLinear(largeColor, bgrSubRegion, maskLarge, maskLargeInv, bgrSubRegion); CvInvoke.CvtColor(bgrSubRegion, subRegion, ColorConversion.Bgr2Bgra); } } else { CvInvoke.BlendLinear(largeColor, subRegion, maskLarge, maskLargeInv, subRegion); } } } } } } long time = 0; return(new Tuple <Mat, String, long>(image[0], null, time)); }); t.Start(); var result = await t; SetImage(t.Result.Item1); String computeDevice = CvInvoke.UseOpenCL ? "OpenCL: " + Ocl.Device.Default.Name : "CPU"; SetMessage(t.Result.Item2); }; }
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); OnImagePicked += (sender, image) => { if (image == null) { return; } ISharedPreferences preference = PreferenceManager.GetDefaultSharedPreferences(ApplicationContext); String appVersion = PackageManager.GetPackageInfo(PackageName, Android.Content.PM.PackageInfoFlags.Activities).VersionName; if (!preference.Contains("tesseract-data-version") || !preference.GetString("tesseract-data-version", null).Equals(appVersion) || !preference.Contains("tesseract-data-path")) { AndroidFileAsset.OverwriteMethod overwriteMethod = AndroidFileAsset.OverwriteMethod.AlwaysOverwrite; FileInfo a8 = AndroidFileAsset.WritePermanantFileAsset(this, "tessdata/eng.traineddata", "tmp", overwriteMethod); FileInfo a0 = AndroidFileAsset.WritePermanantFileAsset(this, "tessdata/eng.cube.bigrams", "tmp", overwriteMethod); FileInfo a1 = AndroidFileAsset.WritePermanantFileAsset(this, "tessdata/eng.cube.fold", "tmp", overwriteMethod); FileInfo a2 = AndroidFileAsset.WritePermanantFileAsset(this, "tessdata/eng.cube.lm", "tmp", overwriteMethod); FileInfo a3 = AndroidFileAsset.WritePermanantFileAsset(this, "tessdata/eng.cube.nn", "tmp", overwriteMethod); FileInfo a4 = AndroidFileAsset.WritePermanantFileAsset(this, "tessdata/eng.cube.params", "tmp", overwriteMethod); FileInfo a5 = AndroidFileAsset.WritePermanantFileAsset(this, "tessdata/eng.cube.size", "tmp", overwriteMethod); FileInfo a6 = AndroidFileAsset.WritePermanantFileAsset(this, "tessdata/eng.cube.word-freq", "tmp", overwriteMethod); FileInfo a7 = AndroidFileAsset.WritePermanantFileAsset(this, "tessdata/eng.tesseract_cube.nn", "tmp", overwriteMethod); //save tesseract data path ISharedPreferencesEditor editor = preference.Edit(); editor.PutString("tesseract-data-version", appVersion); editor.PutString("tesseract-data-path", System.IO.Path.Combine(a0.DirectoryName, "..") + System.IO.Path.DirectorySeparatorChar); editor.Commit(); } LicensePlateDetector detector = new LicensePlateDetector(preference.GetString("tesseract-data-path", null)); Stopwatch watch = Stopwatch.StartNew(); // time the detection process List <IInputOutputArray> licensePlateImagesList = new List <IInputOutputArray>(); List <IInputOutputArray> filteredLicensePlateImagesList = new List <IInputOutputArray>(); List <RotatedRect> licenseBoxList = new List <RotatedRect>(); List <string> words = detector.DetectLicensePlate( image, licensePlateImagesList, filteredLicensePlateImagesList, licenseBoxList); watch.Stop(); //stop the timer StringBuilder builder = new StringBuilder(); builder.Append(String.Format("{0} milli-seconds. ", watch.Elapsed.TotalMilliseconds)); foreach (String w in words) { builder.AppendFormat("{0} ", w); } SetMessage(builder.ToString()); foreach (RotatedRect box in licenseBoxList) { Rectangle rect = box.MinAreaRect(); CvInvoke.Rectangle(image, rect, new Bgr(System.Drawing.Color.Red).MCvScalar, 2); } SetImageBitmap(image.ToBitmap()); image.Dispose(); }; OnButtonClick += delegate { PickImage("license-plate.jpg"); }; }
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); //opencv preferences AppPreference appPreference = new AppPreference(); CvInvoke.UseOpenCL = false; // appPreference.UseOpenCL; System.String oclDeviceName = appPreference.OpenClDeviceName; if (!System.String.IsNullOrEmpty(oclDeviceName)) { Log.Error(TAG, "\t\t --OclSetDefaultDevice: " + oclDeviceName); CvInvoke.OclSetDefaultDevice(oclDeviceName); } ISharedPreferences preference = PreferenceManager.GetDefaultSharedPreferences(ApplicationContext); System.String appVersion = PackageManager.GetPackageInfo(PackageName, Android.Content.PM.PackageInfoFlags.Activities).VersionName; if (!preference.Contains("cascade-data-version") || !preference.GetString("cascade-data-version", null).Equals(appVersion) || !(preference.Contains("cascade-eye-data-path") || preference.Contains("cascade-face-data-path"))) { AndroidFileAsset.OverwriteMethod overwriteMethod = AndroidFileAsset.OverwriteMethod.AlwaysOverwrite; FileInfo eyeFile = AndroidFileAsset.WritePermanantFileAsset(this, "haarcascade_eye.xml", "cascade", overwriteMethod); FileInfo faceFile = AndroidFileAsset.WritePermanantFileAsset(this, "haarcascade_frontalface_default.xml", "cascade", overwriteMethod); Log.Error(TAG, "\t\t --eyeFile.FullName: " + eyeFile.FullName); Log.Error(TAG, "\t\t --faceFile.FullName: " + faceFile.FullName); //save tesseract data path ISharedPreferencesEditor editor = preference.Edit(); editor.PutString("cascade-data-version", appVersion); editor.PutString("cascade-eye-data-path", eyeFile.FullName); editor.PutString("cascade-face-data-path", faceFile.FullName); editor.Commit(); } eyeXml = preference.GetString("cascade-eye-data-path", null); faceXml = preference.GetString("cascade-face-data-path", null); Log.Error(TAG, "\t\t --eyeXml: " + eyeXml); Log.Error(TAG, "\t\t --faceXml: " + faceXml); // Hide the window title and go fullscreen. RequestWindowFeature(WindowFeatures.NoTitle); Window.AddFlags(WindowManagerFlags.Fullscreen); SetContentView(Resource.Layout.take_photo_surface_view); //SurfaceView mSV = (SurfaceView)FindViewById(Resource.Id.CameraView); //mTextureView = (AutoFitTextureView)FindViewById(Resource.Id.CameraView); mTransparentView = (SurfaceView)FindViewById(Resource.Id.TransparentView); mTransparentView.SetZOrderOnTop(true); mTransparentView.BringToFront(); mTransparentView.Holder.SetFormat(Android.Graphics.Format.Transparent); mTransparentView.Holder.AddCallback(this); var manager = GetSystemService(Context.WindowService).JavaCast <IWindowManager>(); var size = new Android.Graphics.Point(); manager.DefaultDisplay.GetSize(size); screenX = size.X / 2; screenY = size.Y / 2; L = screenX - 100; T = screenY - 100; R = screenX + 100; B = screenY + 100; }
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); AppPreference appPreference = new AppPreference(); CvInvoke.UseOpenCL = false; //appPreference.UseOpenCL; string oclDeviceName = appPreference.OpenClDeviceName; if (!string.IsNullOrEmpty(oclDeviceName)) { CvInvoke.OclSetDefaultDevice(oclDeviceName); Log.Error(TAG, "\t\t --OclSetDefaultDevice: " + oclDeviceName); } mFile = new Java.IO.File(GetExternalFilesDir(null), "derp.jpg"); ISharedPreferences preference = PreferenceManager.GetDefaultSharedPreferences(ApplicationContext); string appVersion = PackageManager.GetPackageInfo(PackageName, Android.Content.PM.PackageInfoFlags.Activities).VersionName; if (!preference.Contains("cascade-data-version") || !preference.GetString("cascade-data-version", null).Equals(appVersion) || !(preference.Contains("cascade-eye-data-path") || preference.Contains("cascade-face-data-path"))) { AndroidFileAsset.OverwriteMethod overwriteMethod = AndroidFileAsset.OverwriteMethod.AlwaysOverwrite; FileInfo eyeFile = AndroidFileAsset.WritePermanantFileAsset(this, "haarcascade_eye.xml", "cascade", overwriteMethod); FileInfo faceFile = AndroidFileAsset.WritePermanantFileAsset(this, "haarcascade_frontalface_alt_tree.xml", "cascade", overwriteMethod); Log.Error(TAG, "\t\t --eyeFile.FullName: " + eyeFile.FullName); Log.Error(TAG, "\t\t --faceFile.FullName: " + faceFile.FullName); //save tesseract data path ISharedPreferencesEditor editor = preference.Edit(); editor.PutString("cascade-data-version", appVersion); editor.PutString("cascade-eye-data-path", eyeFile.FullName); editor.PutString("cascade-face-data-path", faceFile.FullName); editor.Commit(); } eyeXml = preference.GetString("cascade-eye-data-path", null); faceXml = preference.GetString("cascade-face-data-path", null); Log.Error(TAG, "\t\t --eyeXml: " + eyeXml); Log.Error(TAG, "\t\t --faceXml: " + faceXml); //face = new CascadeClassifier(faceXml); //eye = new CascadeClassifier(eyeXml); // Hide the window title and go fullscreen. RequestWindowFeature(WindowFeatures.NoTitle); Window.AddFlags(WindowManagerFlags.Fullscreen); SetContentView(Resource.Layout.take_photo_surface_view); mTextureView = (AutoFitTextureView)FindViewById(Resource.Id.CameraView); mTransparentView = (SurfaceView)FindViewById(Resource.Id.TransparentView); mTransparentView.SetZOrderOnTop(true); mTransparentView.BringToFront(); mTransparentView.Holder.SetFormat(Android.Graphics.Format.Transparent); mTransparentView.Holder.AddCallback(this); var manager = GetSystemService(Context.WindowService).JavaCast <IWindowManager>(); var size = new Android.Graphics.Point(); manager.DefaultDisplay.GetSize(size); screenX = size.X / 2; screenY = size.Y / 2; L = screenX - 200; T = screenY - 200; R = screenX + 200; B = screenY + 200; mStateCallback = new CameraStateListener() { owner = this }; mSurfaceTextureListener = new Camera2BasicSurfaceTextureListener(this); mOnImageAvailableListener = new ImageAvailableListener() { Owner = this }; // fill ORIENTATIONS list ORIENTATIONS.Append((int)SurfaceOrientation.Rotation0, 90); ORIENTATIONS.Append((int)SurfaceOrientation.Rotation90, 0); ORIENTATIONS.Append((int)SurfaceOrientation.Rotation180, 270); ORIENTATIONS.Append((int)SurfaceOrientation.Rotation270, 180); }