OpenCV камера "JavaCameraView" захват изображения для Android -Xamarin
Я занимаюсь разработкой и открытием приложения для Android на xamarin visual studio, чтобы обнаруживать и рисовать контуры на объектах в кадре. Я могу рисовать контуры на виде в реальном времени с камеры, но не могу сделать снимок экрана с нарисованными контурами. Я не могу захватить осыпь. Я попытался сделать кнопку и создать onClickListener для захвата растрового изображения и отображения его в ImageVIew, но не получилось
using System;
using System.Collections.Generic;
using System.Lanq;
using System.Text;
using System.Diagnostics;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using OpenCV.Core;
using OpenCV.ObjDetect;
using OpenCV.Android;
using Java.IO;
using Android.Util;
using Size = OpenCV.Core.Size;
using OpenCV.ImgProc;
using Java.Lang;
using Android.Provider;
using Android.Graphics;
using Android.Graphics.Drawables;
namespace Worldview.Activities
{
[Activity(Label = "OpenCVActivity", Theme = "@style/NoAction")]
public class OpenCVActivity : Activity, CameraBridgeViewBase.ICvCameraViewListener2
{
private JavaCameraView _cvCameraView;
private Mat _image;
private ImageView _imageView;
//private Button switchbutton;
public Bitmap capturedScreen;
public Java.Lang.Boolean bitmapNeeded = (Java.Lang.Boolean)false;
//private View targetView;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.OpenCVActivity);
_cvCameraView = FindViewById(Resource.Id.cvView) as JavaCameraView;
_cvCameraView.SetCvCameraViewListener2(this);
_cvCameraView.SetMaxFrameSize(640, 420);
_cvCameraView.DrawingCacheEnabled = true;
Button button = (Button)FindViewById(Resource.Id.click_button);
_imageView = (ImageView)FindViewById(Resource.Id.imageView1);
//targetView = FindViewById(Resource.Id.cvView);
button.Click += BtnCamera_Click;
}
public void BtnCamera_Click(object sender, EventArgs e)
{
_cvCameraView.BuildDrawingCache();
capturedScreen = Bitmap.CreateBitmap(_cvCameraView.Resources.DisplayMetrics.WidthPixels,_cvCameraView.Resources.DisplayMetrics.HeightPixels,Bitmap.Config.Argb8888);
//Bitmap bit = Bitmap.CreateBitmap(10, 10, Bitmap.Config.Argb4444);
Canvas canvas = new Canvas(capturedScreen);
canvas.DrawBitmap(capturedScreen,0,0,null);
ImageView _newImageView = FindViewById(Resource.Id.imageView1) as ImageView;
//_newImageView.SetImageBitmap(capturedScreen);
if (capturedScreen != null)
{
_newImageView.SetImageDrawable(new BitmapDrawable(capturedScreen));
_cvCameraView.Visibility = ViewStates.Gone;
_newImageView.Visibility = ViewStates.Visible;
_newImageView.Invalidate();
_newImageView.RequestLayout();
}
else {
_cvCameraView.Visibility = ViewStates.Visible;
}
protected override void OnResume()
{
base.OnResume();
XamarinBaseLoaderCallback callback = new XamarinBaseLoaderCallback(this, this, _cvCameraView);
OpenCVLoader.InitAsync(OpenCVLoader.OpencvVersion300, this, callback);
}
protected override void OnPause()
{
base.OnPause();
}
public Mat OnCameraFrame(CameraBridgeViewBase.ICvCameraViewFrame inputFrame)
{
Mat input = inputFrame.Rgba();
JavaList<MatOfPoint> contours = new JavaList<MatOfPoint>();
Mat gray = new Mat();
Imgproc.CvtColor(p0: input, p1: gray, p2: Imgproc.ColorRgb2gray);
Mat blur = new Mat();
Imgproc.GaussianBlur(gray, blur, new Size(7, 7), -2);
Mat thresh = new Mat();
Imgproc.Threshold(blur, thresh, 127, 250, Imgproc.ThreshBinary);
Mat edged = new Mat();
Imgproc.Canny(thresh, thresh, 25, 50);
//Imgproc.Dilate(thresh, thresh, new Mat(), new Point(-1, 1), 1);
Mat hierarchy = thresh.Clone();
Imgproc.FindContours(hierarchy, contours, new Mat(), Imgproc.RetrExternal, Imgproc.ChainApproxNone);
JavaSystem.Out.Println("contours" + contours);
if (contours != null)
{
JavaSystem.Out.Println("found contours");
JavaSystem.Out.Println("contours" + contours);
Imgproc.DrawContours(input, contours, -1, new Scalar(255, 0, 0), 1);
}
else
{
JavaSystem.Out.Println("no contours");
}
//Core.Flip(input, input,4);
_image = input;
return input;
}
public void OnCameraViewStarted(int p0, int p1)
{
}
public void OnCameraViewStopped()
{
}
}
internal class ArrayList<T> : List<MatOfPoint>
{
}
public class XamarinBaseLoaderCallback : BaseLoaderCallback
{
public JavaCameraView _cvCameraView;
public XamarinBaseLoaderCallback(OpenCVActivity activity, Context context, JavaCameraView view) : base(context)
{
_cvCameraView = view;
}
public override void OnManagerConnected(int status)
{
switch (status)
{
case 0:
System.Console.WriteLine("OpenCV loaded successfully");
_cvCameraView.EnableView();
break;
default:
base.OnManagerConnected(status);
break;
}
}
}