Компьютерное зрение. Обнаружение изображения на кадре из прямой трансляции. C#

  1. Нужно взять ссылку на прямую трансляцию на ютубе и использовать её внутри приложения WinForm
  2. Получив прямую трансяляцию, мы берем из нее каждый n-ый кадр
  3. На каждом взятом кадре, нужно искать конкретное изображение
  4. При нахождении такого изображения на кадре из трансляции, делать определенные действия

Подскажите, какие библиотеки использовать и как это всё реализовать?

Я сделал приложеие, по поиску пешеходов на видео(установленном на компъютер). Можно отталкиваться от него,только вместо скаченого видео - использовать прямую трансляцию, и вместо поиска пешеходов - искать конкретное изображение на кадре.

using System;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;

namespace WindowsFormsApp227
{
    public partial class Form1 : Form
    {

        // Поле отвечающее за видео
        private VideoCapture capture = null;

        // Общее количество кадров в видео
        private double frames;

        // Текущий кадр процесса проигрования видео
        private double framesCounter;
        
        // Статус проигрования
        private bool play = false;

        // 
        private double fps;


        public Form1()
        {
            InitializeComponent();
        }



        //
        private Image<Bgr, byte> Find(Image<Bgr, byte> image)
        {
            MCvObjectDetection[] regions;
            
            using(HOGDescriptor descriptor = new HOGDescriptor())
            {
                descriptor.SetSVMDetector(HOGDescriptor.GetDefaultPeopleDetector());
                regions = descriptor.DetectMultiScale(image);
            }

            foreach (MCvObjectDetection pesh in regions)
            {
                image.Draw(pesh.Rect, new Bgr(Color.Red), 3);

                CvInvoke.PutText(image, "Peshehod", new Point(pesh.Rect.X, pesh.Rect.Y),
                    Emgu.CV.CvEnum.FontFace.HersheyPlain, 1, new MCvScalar(255,255,255), 2);
            }

            return image;
        }



        //
        private async void ReadFrames()
        {
            Mat m = new Mat();

            while (play && framesCounter < frames)
            {
                framesCounter += 1;

                capture.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.PosFrames, framesCounter);

                capture.Read(m);
                pictureBox1.Image = m.Bitmap;
                pictureBox2.Image = Find(m.ToImage<Bgr, byte>()).Bitmap;

                await Task.Delay(1000 / Convert.ToInt16(fps));
            }
        }


        //
        private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult res = openFileDialog1.ShowDialog();

                if (res == DialogResult.OK)
                {
                    capture = new VideoCapture(openFileDialog1.FileName);
                    Mat m = new Mat();
                    capture.Read(m);
                    pictureBox1.Image = m.Bitmap;

                    fps = capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);
                    frames = capture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount);
                    framesCounter = 1;

                }
                else
                {
                    MessageBox.Show("Vido not intered");
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) ;
            }
        }



        private void raspoznat()
        {
            try
            {
                if (capture == null)
                    throw new Exception("Video ne vibrano");


                play = true;
                ReadFrames();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        private  void toolStripButton1_Click(object sender, EventArgs e)
        {
            raspoznat();
        }

        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            try
            {
                play = false;
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
        }


        //
        private void расспознатьПешеходовToolStripMenuItem_Click(object sender, EventArgs e)
        {
            raspoznat();
        }
    }
}


Ответы (0 шт):