带EmguCV的Alturos.YOLO,视频流,但对象检测停止

时间:2019-12-11 07:57:59

标签: object video-streaming emgucv detection yolo

我正在尝试通过相机进行物体检测。当它运行时,视频流,但是只有第一帧的检测内容(类名和边界框)保留在视频上。它有什么问题,内存管理或逻辑错误?我认为Alturos.YOLO没有任何问题,可能与位图转换有关,这些行:

using (Bitmap bimp = nextFrame.Bitmap)
{
    bimp.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
    var items = yoloWrapper.Detect(memory.ToArray()).ToList();
    addDetails(bimp, items);
    Image<Bgr, Byte> detailed = new Image<Bgr, Byte>(bimp);
    viewer.Image = detailed;
    detailed.Dispose();
}

我不确定<code>showDialog()</code><code>Dispose()</code>的用法是否正确。
感谢您的帮助。

代码

using System;
using Alturos.Yolo;
using Emgu.CV;
using Emgu.CV.Structure;
using System.Drawing;
using System.Windows.Forms;
using Emgu.CV.UI;
using System.Linq;
using System.Collections.Generic;
using Alturos.Yolo.Model;

namespace ConsoleApp2
{
    class Program
    {
        public static void Main(string[] args)
        {
            Capturer call1 = new Capturer();
            call1.CaptureIt();
        }
        class Capturer
        {
            public void CaptureIt()
            {
                ImageViewer viewer = new ImageViewer();
                VideoCapture capture = new VideoCapture();
                var memory = new System.IO.MemoryStream();
                var font = new Font("Arial", 18, FontStyle.Italic);
                var brush = new SolidBrush(Color.Blue);
                var pen = new Pen(Color.Blue, 6);
                void addDetails(Bitmap image, List<YoloItem> yolotem)
                {                   
                    var graphic = Graphics.FromImage(image);
                    foreach (var item in yolotem)
                    {
                        var width = item.Width;
                        var height = item.Height;
                        var type = item.Type;
                        var confidence = item.Confidence;
                        var box = new Rectangle(item.X, item.Y, width, height);
                        var point = new Point(item.X, item.Y);
                        var str = type + "  " + confidence;
                        graphic.DrawRectangle(pen, box);
                        graphic.DrawString(str, font, brush, point);
                    }
                }
                using (var yoloWrapper = new YoloWrapper("yolov2-tiny-voc.cfg", "yolov2-tiny-voc.weights", "voc.names"))
                {
                    Application.Idle += new EventHandler(delegate (object sender, EventArgs e)
                    {
                        var nextFrame = capture.QueryFrame();                
                        using (Bitmap bimp = nextFrame.Bitmap)
                        {
                            bimp.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
                            var items = yoloWrapper.Detect(memory.ToArray()).ToList();
                            addDetails(bimp, items);
                            Image<Bgr, Byte> detailed = new Image<Bgr, Byte>(bimp);
                            viewer.Image = detailed;
                            detailed.Dispose();
                        }                     
                    });
                    viewer.ShowDialog();                  
                }
            }
        }
    }
}

0 个答案:

没有答案