Я хотел бы сделать обнаружение движения в С# (используя EmguCV 3.0), чтобы удалить объект в движении или на переднем плане, чтобы нарисовать оверлей.
Вот пример теста, который я сделал с Kinect (потому что это камера глубины)
Как я могу начать работу с EmguCV 3.0?
- Я пробовал много кода удаления фона, которые не работают.
- Кажется, OpticalFlow - хорошее начало, но нет примера в EmguCV 3.0
- Если я нахожу самый большой blob, как я могу найти его контуры?
Может кто-нибудь помочь мне начать?
РЕДАКТИРОВАТЬ: 17/06/2015
В EmguCV3.0.0 RC я не вижу OpticalFlow в пакете и документации: http://www.emgu.com/wiki/files/3.0.0-rc1/document/html/b72c032d-59ae-c36f-5e00-12f8d621dfb8.htm
Есть только: DenseOpticalFlow, OpticalFlowDualTVL1???
Это код AbsDiff:
var grayFrame = frame.Convert<Gray, Byte>();
var motionFrame = grayFrame.AbsDiff(backFrame)
.ThresholdBinary(new Gray(20), new Gray(255))
.Erode(2)
.Dilate(2);
Результат:
Я не знаю, как получить движение в белом?
Это код BLOB:
Image<Bgr, Byte> smoothedFrame = new Image<Bgr, byte>(frame.Size);
CvInvoke.GaussianBlur(frame, smoothedFrame, new Size(3, 3), 1); //filter out noises
Mat forgroundMask = new Mat();
fgDetector.Apply(smoothedFrame, forgroundMask);
CvBlobs blobs = new CvBlobs();
blobDetector.Detect(forgroundMask.ToImage<Gray, byte>(), blobs);
blobs.FilterByArea(400, int.MaxValue);
blobTracker.Update(blobs, 1.0, 0, 1);
foreach (var pair in blobs) {
CvBlob b = pair.Value;
CvInvoke.Rectangle(frame, b.BoundingBox, new MCvScalar(255.0, 255.0, 255.0), 2);
}
Результат:
Почему так много ложных срабатываний?
Это код MOG2:
forgroundDetector.Apply(frame, forgroundMask);
motionHistory.Update(forgroundMask);
var motionMask = GetMotionMask();
Image<Bgr, Byte> motionImage = new Image<Bgr, byte>(motionMask.Size);
CvInvoke.InsertChannel(motionMask, motionImage, 0);
Rectangle[] rects;
using (VectorOfRect boundingRect = new VectorOfRect()) {
motionHistory.GetMotionComponents(segMask, boundingRect);
rects = boundingRect.ToArray();
}
foreach (Rectangle comp in rects) { ...
Результат:
Если я выбираю самую большую область, как я могу получить контур объекта?