Пример #1
0
        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);
        }
        /// <summary>
        /// add result of video surveillance detection
        /// must run under lock()
        /// </summary>
        /// <param name="blob"></param>
        /// <param name="currentPanKinect"></param>
        /// <param name="currentTiltKinect"></param>
        /// <returns>can return null</returns>
        public VideoSurveillanceTarget Update(MCvBlob blob, double currentPanKinect, double currentTiltKinect)
        {
            VideoSurveillanceTarget target;

            if (tempTargetStorage.ContainsKey(blob.ID))
            {
                target           = tempTargetStorage[blob.ID];
                target.TimeStamp = DateTime.Now;
                target.Update(blob, currentPanKinect, currentTiltKinect);
            }
            else
            {
                target = new VideoSurveillanceTarget(this, blob.ID, blob, currentPanKinect, currentTiltKinect);
                if (target.Rank > 1.0d)
                {
                    tempTargetStorage.Add(blob.ID, target);
                }
                else
                {
                    target = null;
                }
            }

            return(target);
        }
Пример #3
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 = CvBlobTrackerAddBlob(
                _ptr,
                ref blob,
                currentImage == null ? IntPtr.Zero : currentImage.Ptr,
                currentForegroundMask);

            return((MCvBlob)Marshal.PtrToStructure(bobPtr, typeof(MCvBlob)));
        }
Пример #4
0
        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;
            }
        }
Пример #5
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 <TColor, TDepth>(MCvBlob blob, Image <TColor, TDepth> currentImage, Image <Gray, Byte> currentForegroundMask)
            where TColor : struct, IColor
            where TDepth : new()
        {
            IntPtr bobPtr = CvBlobTrackerAddBlob(
                _ptr,
                ref blob,
                currentImage == null ? IntPtr.Zero : currentImage.Ptr,
                currentForegroundMask);

            return((MCvBlob)Marshal.PtrToStructure(bobPtr, typeof(MCvBlob)));
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
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);
        }
Пример #9
0
        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);
                    }
                }
            }
        }
Пример #10
0
 public extern static IntPtr CvBlobTrackerAddBlob(IntPtr tracker, ref MCvBlob blob, IntPtr currentImage, IntPtr currentForegroundMask);
Пример #11
0
 internal static extern void CvBlobSeqAddBlob(IntPtr blobSeq, ref MCvBlob blob);
Пример #12
0
 public VideoSurveillanceTarget(VideoSurveillanceDecider decider, int id, MCvBlob blob, double currentPanKinect, double currentTiltKinect)
     : this(decider, id, VideoTargetType.SurveillanceBlob)
 {
     Update(blob, currentPanKinect, currentTiltKinect);
 }
Пример #13
0
 public BlobENumeroDoFrame(MCvBlob pBlob, int pNumeroDoFrame)
 {
     mBlob          = pBlob;
     mNumeroDoFrame = pNumeroDoFrame;
 }
Пример #14
0
 internal static extern IntPtr CvBlobTrackerAddBlob(IntPtr tracker, ref MCvBlob blob, IntPtr currentImage, IntPtr currentForegroundMask);
Пример #15
0
 internal extern static void CvBlobSeqAddBlob(IntPtr blobSeq, ref MCvBlob blob);
Пример #16
0
        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;
        }
Пример #17
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)
 {
     CvBlobSeqAddBlob(_ptr, ref blob);
 }
Пример #18
0
 internal void adicionarNovoBlob(MCvBlob pBlob, int pNumeroDoFrame)
 {
     mListaBlobsENumeroFrame.Add(new BlobENumeroDoFrame(pBlob, pNumeroDoFrame));
     mPossuiMovimentoSuspeito = null;
 }