我是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 +质心的代码,与背景减法代码中的视频文件一起使用。我知道,鉴于我已经拥有的东西,我所缺少的东西可能非常简单,我只需要另一组眼睛,这可以帮助我发现缺少的东西。