Компьютерное зрение. Обнаружение изображения на кадре из прямой трансляции. C#
- Нужно взять ссылку на прямую трансляцию на ютубе и использовать её внутри приложения WinForm
- Получив прямую трансяляцию, мы берем из нее каждый n-ый кадр
- На каждом взятом кадре, нужно искать конкретное изображение
- При нахождении такого изображения на кадре из трансляции, делать определенные действия
Подскажите, какие библиотеки использовать и как это всё реализовать?
Я сделал приложеие, по поиску пешеходов на видео(установленном на компъютер). Можно отталкиваться от него,только вместо скаченого видео - использовать прямую трансляцию, и вместо поиска пешеходов - искать конкретное изображение на кадре.
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();
}
}
}