我想用C#(使用EmguCV 3.0)进行运动检测,以便移除运动中的对象或前景,并绘制叠加层。
这是我使用Kinect进行的一个样本测试(因为它是深度相机)
如何开始使用EmguCV 3.0?
- 我尝试了很多无法工作的背景去除代码
- 看起来OpticalFlow是一个不错的开始,但在EmguCV 3.0中没有例子
- 如果我找到最大的斑点,如何找到它的轮廓?
有人能帮助我入门吗?
编辑: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) { ...
结果:
如果我选择最大的面积,如何获取物体的轮廓?
OpticalFlow.LK(...)
,使用Lukas-Kanade算法,它在关键点上运行并测量光流。它比密集光流更快,但需要对象具有良好的关键点,并且您不会得到明显的区域。另外,除了AbsDiff之外,您还使用了哪些代码? - Mark Miller