我正在尝试通过相机进行物体检测。当它运行时,视频流,但是只有第一帧的检测内容(类名和边界框)保留在视频上。它有什么问题,内存管理或逻辑错误?我认为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();
}
}
}
}
}