OpenCVSharp:需要帮助使用Bounding Box + Centroids跟踪移动视频文件中的白色斑点

时间:2018-03-17 16:13:29

标签: c# opencv computer-vision opencvsharp

我是Stack Overflow的新手,所以如果这个问题过于宽泛,偏离主题,或者我是否要提供不充分或不必要的信息,我会道歉,但我真的需要一些帮助!我是计算机视觉的新手,我的任务如下:

我需要录制一个视频文件(在我的特殊情况下,我们正在录制简单的人体运动模式,例如直线行走,圆形,曲折等等......我们稍后会用它来深入学习卷积神经网络)最终目标是代码在视频文件上执行背景减法/前景检测,检测&使用红色边界框跟踪前景蒙版中的白色斑点(忽略应被视为噪声的较小斑点),最重要的是在人移动时计算和更新视频每帧中边界框的质心,并输出每帧的质心信息到文本文件,而不是控制台窗口。然后使用质心信息开发一个带有Tensorflow的小型深度学习数据库,这样当我们给程序一个无法识别的x,y质心坐标模式时,它会将这些坐标与数据库中的坐标模式进行比较,然后是能够说“这是模式1或模式2 ......等”

这是在提供的VIDEO文件上进行背景扣除的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenCvSharp;
using OpenCvSharp.CPlusPlus;
using OpenCvSharp.Blob;

namespace OpenCvSharp.Test
{
    /// <summary>
    /// 
    /// </summary>
    class BgSubtractorMOG
    {
        public BgSubtractorMOG()
        {
            //using (CvCapture capture = CvCapture.FromCamera(0)) // for webcam
            //using (IplImage img = cap.QueryFrame())
            using (CvCapture capture = new CvCapture("C:\\Users\\tev\\Documents\\Scenario 1.avi")) // specify your movie file
            using (BackgroundSubtractorMOG mog = new BackgroundSubtractorMOG())
            using (CvWindow windowSrc = new CvWindow("src"))
            using (CvWindow windowDst = new CvWindow("dst"))
            {
            IplImage imgFrame;
            using (Mat imgFg = new Mat(capture.FrameWidth, capture.FrameHeight, MatrixType.U8C1))
                while ((imgFrame = capture.QueryFrame()) != null)
                {
                    mog.Run(new Mat(imgFrame, false), imgFg, 0.01);

                    windowSrc.Image = imgFrame;
                    windowDst.Image = imgFg.ToIplImage();
                    Cv.WaitKey(50);
                }
        }
    }
}

这是在IMAGES上找到bbox + centroids的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using OpenCvSharp;
using OpenCvSharp.Blob;


namespace WhiteblobDetection
{
    class Program
    {
        static void Main(string[] args)
        {
            //using (IplImage imgSrc = new IplImage("shapes.png", LoadMode.Color))
            using (IplImage imgSrc = new IplImage("C:\\OpenCvSharp\\TestImage\\mydrawing.png", LoadMode.Color))
            using (IplImage imgBinary = new IplImage(imgSrc.Size, BitDepth.U8, 1))
            using (IplImage imgLabel = new IplImage(imgSrc.Size, CvBlobLib.DepthLabel, 1))
            using (IplImage imgDst = new IplImage(imgSrc.Size, BitDepth.U8, 3))
            {
                Cv.CvtColor(imgSrc, imgBinary, ColorConversion.BgrToGray);
                Cv.Threshold(imgBinary, imgBinary, 200, 255, ThresholdType.Binary);

                using (CvBlobs blobs = new CvBlobs())
                {
                    blobs.Label(imgBinary, imgLabel);

                    int count = 0;
                    foreach (var item in blobs)
                    {
                        Console.WriteLine("{0} | Centroid:{1} Area:{2}", item.Key, item.Value.Centroid, item.Value.Area);

                        // draw rectangle
                        imgSrc.DrawRect( item.Value.Rect, CvColor.Red);
                        // draw cross at the centroid
                        CvPoint pt1, pt2;
                        int d = 3;
                        pt1.X = (int)item.Value.Centroid.X - d;
                        pt1.Y = (int)item.Value.Centroid.Y;
                        pt2.X = (int)item.Value.Centroid.X + d;
                        pt2.Y = (int)item.Value.Centroid.Y;

                        //imgSrc.DrawLine(item.Value.Centroid, item.Value.Rect.TopLeft, CvColor.Red, 1);
                        imgSrc.DrawLine( pt1, pt2, CvColor.Red, 1);
                        pt1.X = (int)item.Value.Centroid.X;
                        pt1.Y = (int)item.Value.Centroid.Y - d;
                        pt2.X = (int)item.Value.Centroid.X;
                        pt2.Y = (int)item.Value.Centroid.Y + d;
                        imgSrc.DrawLine(pt1, pt2, CvColor.Red, 1);

                    }
                    blobs.RenderBlobs(imgLabel, imgSrc, imgDst);

                }
            }
         }
        }
}

我不是在寻找有人为我编写解决方案,因为我不会那样学习任何东西。 (虽然如果你这样做我会永远爱你!哈哈)。我只是在寻找可以用来帮助我学习的想法或更深入的文档。

这是顾问提供给我的两个示例代码。我只修改了我所理解的内容,并且可以在互联网上找到文档,但OpenCVSharp没有太多内容,作为计算机视觉的新手,我很难尝试将C ++ OpenCV代码移植到OpenCVSharp。 / p>

总而言之,我的任务基本上是以这样的方式组合代码,即在图像上查找bbox +质心的代码,与背景减法代码中的视频文件一起使用。我知道,鉴于我已经拥有的东西,我所缺少的东西可能非常简单,我只需要另一组眼睛,这可以帮助我发现缺少的东西。

0 个答案:

没有答案