Udało mi się wyświetlić strumień kamery na textureview i wykonanie bitmapy do odczytu pikseli każdej klatki strumienia. Następnie mogę zastosować algorytm śledzenia, aby śledzić piłkę na przykład. Ale teraz chciałbym wyświetlić czerwony znak (na przykład), który pokazuje pozycję znalezionej piłki. Jak mogę to zrobić?

1
Antoine Martin 16 luty 2017, 15:28

2 odpowiedzi

Najlepsza odpowiedź

Wierzę, że istnieje wiele sposobów na narysowanie znaku na widoku kamery. Tutaj użyłem SurfaceView. Podstawowym pomysłem jest ustawienie SurfaceView na górze Textureview z przezroczystym tłem.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <TextureView android:id="@+id/textureView"
               android:layout_height="match_parent"
               android:layout_width="match_parent" />

  <SurfaceView
        android:id="@+id/surfaceview"
        android:layout_height="match_parent"
        android:layout_width="match_parent" />
</RelativeLayout >

Kod tyłu:

public class MainActivity : Activity, TextureView.ISurfaceTextureListener
{
    private Android.Hardware.Camera _camera;
    private TextureView _textureView;
    private SurfaceView _surfaceView;
    private ISurfaceHolder holder;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        _textureView = (TextureView)FindViewById(Resource.Id.textureView);
        _textureView.SurfaceTextureListener = this;

        _surfaceView = (SurfaceView)FindViewById(Resource.Id.surfaceview);
        //set to top layer
        _surfaceView.SetZOrderOnTop(true);
        //set the background to transparent
        _surfaceView.Holder.SetFormat(Format.Transparent);
        holder = _surfaceView.Holder;
        _surfaceView.Touch += _surfaceView_Touch;
    }

    private void _surfaceView_Touch(object sender, View.TouchEventArgs e)
    {
        //define the paintbrush
        Paint mpaint = new Paint();
        mpaint.Color = Color.Red;
        mpaint.SetStyle(Paint.Style.Stroke);
        mpaint.StrokeWidth = 2f;

        //draw
        Canvas canvas = holder.LockCanvas();
        //clear the paint of last time
        canvas.DrawColor(Color.Transparent, PorterDuff.Mode.Clear);
        //draw a new one, set your ball's position to the rect here
        var x = e.Event.GetX();
        var y = e.Event.GetY();
        Rect r = new Rect((int)x, (int)y, (int)x + 100, (int)y + 100);
        canvas.DrawRect(r, mpaint);
        holder.UnlockCanvasAndPost(canvas);
    }

    public bool OnSurfaceTextureDestroyed(SurfaceTexture surface)
    {
        _camera.StopPreview();
        _camera.Release();

        return true;
    }

    public void OnSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
    {
        _camera = Android.Hardware.Camera.Open();

        try
        {
            _camera.SetPreviewTexture(surface);
            _camera.SetDisplayOrientation(90);
            _camera.StartPreview();
        }
        catch (Java.IO.IOException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    public void OnSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height)
    {
    }

    public void OnSurfaceTextureUpdated(SurfaceTexture surface)
    {
    }
}

Ponieważ nie mam algorytmu śledzenia, aby śledzić piłkę, użyłem zdarzenia Touch, za każdym razem, gdy wykorzystywałeś SurfaceView, prostokąt z czerwonym skokiem być narysowany na pozycji stuknącej. Możesz zmodyfikować kod w mojej metodzie {x3}} do algorytmu śledzenia i narysuj czerwony znak.

3
Grace Feng 17 luty 2017, 06:41

Musisz utworzyć nowy widok, narysuj wszystko nad tym widokiem i dodaj go przez textureview.

  • Utwórz nowy widok i narysuj wszystko

    public class DrawingView : View
    {
        public DrawingView(Context context) : base(context)
        {
    
        }
    
        protected override void OnDraw(Canvas canvas)
        {
            Paint paint;
            paint = new Paint();
            paint.Color = (Color.Green);
            canvas.DrawRect(0, 0, 300, 300, paint);
            //Draw Anything
            Invalidate();
        }
    }
    
  • Dodaj ten widok na swój teksturoEview

        void SetupUserInterface()
        {
            mainLayout = new RelativeLayout(Context);
    
            liveView = new TextureView(Context);
            RelativeLayout.LayoutParams liveViewParams = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MatchParent,
                RelativeLayout.LayoutParams.MatchParent);
            liveView.LayoutParameters = liveViewParams;
            mainLayout.AddView(liveView);
    
    
    
            drawingView = new DrawingView(Context);
            RelativeLayout.LayoutParams captureButtonParams = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MatchParent,
                RelativeLayout.LayoutParams.MatchParent);
            drawingView.LayoutParameters = captureButtonParams;
            mainLayout.AddView(drawingView);
    
          AddView(mainLayout);
        }
    
0
Led Machine 21 maj 2020, 22:20