/// <summary> /// Add new blob to track it and assign to this blob personal ID /// </summary> /// <param name="blob">Structure with blob parameters (ID is ignored)</param> /// <param name="currentImage">current image</param> /// <param name="currentForegroundMask">Current foreground mask</param> /// <returns>Newly added blob</returns> public MCvBlob Add(MCvBlob blob, IImage currentImage, Image<Gray, Byte> currentForegroundMask) { IntPtr bobPtr = CvInvoke.CvBlobTrackerAddBlob( _ptr, ref blob, currentImage == null ? IntPtr.Zero : currentImage.Ptr, currentForegroundMask); return (MCvBlob)Marshal.PtrToStructure(bobPtr, typeof(MCvBlob)); }
public BlobENumeroDoFrame(MCvBlob pBlob, int pNumeroDoFrame) { mBlob = pBlob; mNumeroDoFrame = pNumeroDoFrame; }
internal extern static IntPtr CvBlobTrackerAddBlob(IntPtr tracker, ref MCvBlob blob, IntPtr currentImage, IntPtr currentForegroundMask);
internal void adicionarNovoBlob(MCvBlob pBlob, int pNumeroDoFrame) { mListaBlobsENumeroFrame.Add(new BlobENumeroDoFrame(pBlob, pNumeroDoFrame)); mPossuiMovimentoSuspeito = null; }
/// <summary> /// Add a new blob to the seq /// </summary> /// <param name="blob">The blob sequence to be added</param> public void Add(MCvBlob blob) { CvInvoke.CvBlobSeqAddBlob(_ptr, ref blob); }
public static extern IntPtr CvBlobTrackerAddBlob(IntPtr tracker, ref MCvBlob blob, IntPtr currentImage, IntPtr currentForegroundMask);
private Point[] aplicarFiltroKalman(MCvBlob blob) { if (mPrimeiraExecucao) { kal.PredictedState = new Matrix<float>(new float[4, 1] { {blob.Center.X}, {blob.Center.Y}, {0}, {0} }); } Matrix<float> prediction = kal.Predict(); Point predictPt = new Point((int)prediction[0,0], (int)prediction[1,0]); // Get blob point medidaKalman[0,0] = blob.Center.X; medidaKalman[1,0] = blob.Center.Y; // The update phase Matrix<float> estimado = kal.Correct(medidaKalman); Point estadoPt = new Point((int)estimado[0,0], (int)estimado[1,0]); Point medidoPt = new Point((int)medidaKalman[0,0], (int)medidaKalman[1,0]); Point[] retorno = { estadoPt, medidoPt}; CvInvoke.WaitKey(10); return retorno; }
public void desenharEprocessar() { if (parametros.PontosAreaRestrita != null && parametros.PontosAreaRestrita.Count > 0) { for (int i = 1; i < parametros.PontosAreaRestrita.Count; i++) { //CvInvoke.cvLine(mImagemColorida, parametros.PontosAreaRestrita[i - 1], parametros.PontosAreaRestrita[i], new MCvScalar(255, 0, 0, 0), 1, LINE_TYPE.CV_AA, 0); CvInvoke.Line(mImagemColorida, parametros.PontosAreaRestrita[i - 1], parametros.PontosAreaRestrita[i], new MCvScalar(255, 0, 0, 0), 1, LineType.AntiAlias, 0); } } List<MonitorDePessoa> vPessoasEmCena = new List<MonitorDePessoa>(); foreach (CvBlob blob2 in mblobs.Values) { MCvBlob blob = new MCvBlob(); blob.Center = blob2.Centroid; blob.Size = blob2.BoundingBox.Size; if (verificarSeEhTamanhoDePessoa(blob.Size.Height, blob.Size.Width, blob.Center.X, blob.Center.Y) || verificarExistenciaBlob(blob) != 0) { MonitorDePessoa vMonitorAtual = obterMonitorDePessoa(blob); blob.ID = vMonitorAtual.obterIdentificador(); vMonitorAtual.adicionarNovoBlob(blob, base.mContadorDeFrames); List<Point> vPontos = vMonitorAtual.obterPontos(); // desenharCaminho(vPontos); Point p1 = new Point((int)((blob.Center.X - blob.Size.Width / 2) * 0.98), (int)((blob.Center.Y - blob.Size.Height / 2) * 0.98)); Point p2 = new Point((int)((blob.Center.X + blob.Size.Width / 2) * 1.08), (int)((blob.Center.Y + blob.Size.Height / 2) * 1.08)); MCvScalar corTexto; parametros.RetanguloPessoa = new Rectangle(new Point(p1.X, p2.Y), new Size(p2.X - p1.X, p2.Y - p1.Y)); if (vMonitorAtual.verificarSePossuiComportamentoSuspeito(parametros).Suspeito) corTexto = new MCvScalar(0, 0, 255, 0); else corTexto = new MCvScalar(0, 255, 0, 0); Point[] pontosKalman = aplicarFiltroKalman(blob); corTexto = new MCvScalar(255, 0, 0, 0); vMonitorAtual.adicionarPontoKalman(pontosKalman[1]); //CvInvoke.cvRectangle(mImagemColorida, p1, p2, corTexto, 1, LINE_TYPE.CV_AA, 0); CvInvoke.Rectangle(mImagemColorida, blob2.BoundingBox, new MCvScalar(255.0, 255.0, 255.0), 2); p1.Y = p1.Y - 10; escreverId(blob.ID.ToString(), p1, corTexto); vPessoasEmCena.Add(vMonitorAtual); } } mJanelaMonitoramento.GridPessoasMonitoradas.Rows.Clear(); foreach (MonitorDePessoa vPessoa in vPessoasEmCena) { if (!mJanelaMonitoramento.Visible) return; RespostaVerificacao resposta = vPessoa.verificarSePossuiComportamentoSuspeito(parametros); DataGridViewRow vNovaLinha = new DataGridViewRow(); vNovaLinha.CreateCells(mJanelaMonitoramento.GridPessoasMonitoradas, new String[]{vPessoa.obterIdentificador().ToString(), vPessoa.obterVelocidadeMetroPorSegundo().ToString(), vPessoa.obterVelocidadeKmPorHora().ToString(), vPessoa.obterTempoEmCena().ToString(), vPessoa.obterNumeroDeInversoes().ToString(), resposta.Mensagem}); vNovaLinha.DefaultCellStyle.BackColor = resposta.Suspeito ? Color.Red : Color.Green; vNovaLinha.DefaultCellStyle.SelectionBackColor = vNovaLinha.DefaultCellStyle.BackColor; mJanelaMonitoramento.GridPessoasMonitoradas.Rows.Add(vNovaLinha); } mSalvarImagem = mJanelaMonitoramento.SalvarImagem; mJanelaMonitoramento.SalvarImagem = false; }
private void desenharRetanguloPessoa() { List<MonitorDePessoa> vPessoasEmCena = new List<MonitorDePessoa>(); foreach (var blob2 in mblobs.Values) { MCvBlob blob = new MCvBlob(); blob.Center = blob2.Centroid; blob.Size = blob2.BoundingBox.Size; if (verificarSeEhTamanhoDePessoa(blob.Size.Height, blob.Size.Width, blob.Center.X, blob.Center.Y)) { MonitorDePessoa vMonitorAtual = obterMonitorDePessoa(blob); blob.ID = vMonitorAtual.obterIdentificador(); vMonitorAtual.adicionarNovoBlob(blob, base.mContadorDeFrames); List<Point> vPontos = vMonitorAtual.obterPontos(); desenharCaminho(vPontos, new MCvScalar(0, 0, 255.0, 0)); desenharCaminho(vMonitorAtual.obterPontosKalman(), new MCvScalar(0, 0, 255.0, 0)); Point p1 = new Point((int)((blob.Center.X - blob.Size.Width / 2) * 0.98), (int)((blob.Center.Y - blob.Size.Height / 2) * 0.98)); Point p2 = new Point((int)((blob.Center.X + blob.Size.Width / 2) * 1.08), (int)((blob.Center.Y + blob.Size.Height / 2) * 1.08)); MCvScalar corTexto; parametros.RetanguloPessoa = new Rectangle(new Point(p1.X, p2.Y), new Size(p2.X - p1.X, p2.Y - p1.Y)); // if (verificarSeEhTamanhoDePessoa(parametros.RetanguloPessoa)) if(true) { Point[] pontosKalman = aplicarFiltroKalman(blob); corTexto = new MCvScalar(255, 0, 0, 0); vMonitorAtual.adicionarPontoKalman(pontosKalman[1]); CvInvoke.Rectangle(mImagemColorida, blob2.BoundingBox, new MCvScalar(255.0, 255.0, 255.0), 2); CvInvoke.Line(mImagemColorida, pontosKalman[0], pontosKalman[0], new MCvScalar(255.0, 0, 0, 0), 3); CvInvoke.Line(mImagemColorida, pontosKalman[1], pontosKalman[1], new MCvScalar(0, 0, 255.0, 0), 3); p1.Y = p1.Y - 10; escreverId(blob.ID.ToString(), p1, corTexto); vPessoasEmCena.Add(vMonitorAtual); } } } }
protected override void desenharEMapear() { List<MonitorDePessoa> vPessoasEmCena = new List<MonitorDePessoa>(); foreach (var blob2 in mblobs.Values) { MCvBlob blob = new MCvBlob(); blob.Center = blob2.Centroid; blob.Size = blob2.BoundingBox.Size; if (verificarSeEhTamanhoDePessoa(blob.Size.Height, blob.Size.Width, blob.Center.X, blob.Center.Y)) { MonitorDePessoa vMonitorAtual = obterMonitorDePessoa(blob); blob.ID = vMonitorAtual.obterIdentificador(); vMonitorAtual.adicionarNovoBlob(blob, base.mContadorDeFrames); List<Point> vPontos = vMonitorAtual.obterPontos(); //desenharCaminho(vPontos); Point p1 = new Point((int)((blob.Center.X - blob.Size.Width / 2) * 0.98), (int)((blob.Center.Y - blob.Size.Height / 2) * 0.98)); Point p2 = new Point((int)((blob.Center.X + blob.Size.Width / 2) * 1.08), (int)((blob.Center.Y + blob.Size.Height / 2) * 1.08)); MCvScalar corTexto = new MCvScalar(0, 255, 0, 0); Point[] pontosKalman = aplicarFiltroKalman(blob); corTexto = new MCvScalar(255, 0, 0, 0); vMonitorAtual.adicionarPontoKalman(pontosKalman[1]); //CvInvoke.cvRectangle(mImagemColorida, p1, p2, corTexto, 1, LINE_TYPE.CV_AA, 0); CvInvoke.Rectangle(mImagemColorida, blob2.BoundingBox, new MCvScalar(255.0, 255.0, 255.0), 2); p1.Y = p1.Y - 10; escreverId(blob.ID.ToString(), p1, corTexto); vPessoasEmCena.Add(vMonitorAtual); } } parametros.PontosAreaRestrita = mJanelaAreaRestrita.obterPontos(); desenharCaminho(parametros.PontosAreaRestrita, new MCvScalar(0, 0, 255.0, 0)); mJanelaAreaRestrita.GridPessoasMonitoradas.Rows.Clear(); foreach (MonitorDePessoa vPessoa in vPessoasEmCena) { DataGridViewRow vNovaLinha = new DataGridViewRow(); vNovaLinha.CreateCells(mJanelaAreaRestrita.GridPessoasMonitoradas, new String[]{vPessoa.obterIdentificador().ToString(), vPessoa.obterVelocidadeMetroPorSegundo().ToString(), vPessoa.obterVelocidadeKmPorHora().ToString(), vPessoa.obterTempoEmCena().ToString(), vPessoa.obterNumeroDeInversoes().ToString(), "MAPEANDO..." }); vNovaLinha.DefaultCellStyle.BackColor = Color.Green; vNovaLinha.DefaultCellStyle.SelectionBackColor = vNovaLinha.DefaultCellStyle.BackColor; if (mJanelaAreaRestrita.GridPessoasMonitoradas.ColumnCount > 0) { mJanelaAreaRestrita.GridPessoasMonitoradas.Rows.Add(vNovaLinha); } } if (!mJanelaAreaRestrita.Visible) mFinalizar = true; }
private int verificarExistenciaBlob(MCvBlob pBlob) { foreach (MonitorDePessoa monitor in dicionarioMonitores.Values) { MCvBlob blobAtual = monitor.mListaBlobsENumeroFrame.Last().mBlob; Point pontoPrevisto = monitor.mPontosKalman.Last(); if(pBlob.Size.Height > blobAtual.Size.Height*0.6 && pBlob.Size.Width > blobAtual.Size.Width * 0.6 && pBlob.Size.Height < blobAtual.Size.Height * 1.4 && pBlob.Size.Width < blobAtual.Size.Width * 1.4 && Math.Abs(pBlob.Center.X - pontoPrevisto.X) < 160 && Math.Abs(pBlob.Center.Y - pontoPrevisto.Y) < 160) return blobAtual.ID; } return 0; }
private MonitorDePessoa obterMonitorDePessoa(MCvBlob blob) { MonitorDePessoa vRetorno; int id = verificarExistenciaBlob(blob); if(id == 0) { vRetorno = new MonitorDePessoa(); blob.ID = mContadorDeBlobs; mContadorDeBlobs++; vRetorno.ID = blob.ID; dicionarioBlobs.Add(blob.ID, blob); dicionarioMonitores.Add(blob.ID, vRetorno); } else { vRetorno = dicionarioMonitores[id]; } return vRetorno; }
internal extern static void CvBlobSeqAddBlob(IntPtr blobSeq, ref MCvBlob blob);
public VideoSurveillanceTarget(VideoSurveillanceDecider decider, int id, MCvBlob blob, double currentPanKinect, double currentTiltKinect) : this(decider, id, VideoTargetType.SurveillanceBlob) { Update(blob, currentPanKinect, currentTiltKinect); }
public void Update(MCvBlob blob, double currentPanKinect, double currentTiltKinect) { // keep in mind that due to memory restrictions VideoSurveillance detector was working on the scaled down (to 1/2 size) image. // So all points should be multiplied by two to fit the full scale image. ID = blob.ID; Rectangle br = (System.Drawing.Rectangle)blob; BoundingRectangle = new Rectangle(br.X << 1, br.Y << 1, br.Width << 1, br.Height << 1); this.Center = new System.Drawing.Point((int)blob.Center.X << 1, (int)blob.Center.Y << 1); this.Pan = -FowW * (blob.Center.X - imgWidth / 2.0d) / imgWidth + currentPanKinect; this.Tilt = -FowH * (blob.Center.Y - imgHeight / 2.0d) / imgHeight + currentTiltKinect; CalculateRank(); //Console.WriteLine("********************************************************************** Pan=" + Pan + " Tilt=" + Tilt); }