예제 #1
0
 /// <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;
 }
예제 #3
0
 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;
 }
예제 #5
0
 /// <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);
 }
예제 #6
0
 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;
 }
예제 #13
0
파일: BlobSeq.cs 프로젝트: KaganRoman/Eval
 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);
        }