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;
        }
    }
}

0 ответов

Другие вопросы по тегам