コード例 #1
0
ファイル: ProcessVideo.cs プロジェクト: Lionel1204/MyCode
        public static CaptureData ProcessFrame(CaptureCalc capCalc, CaptureData capData)
        {
            if (capData == null || capCalc == null)
                return new CaptureData();

            capCalc.CaptureC.Retrieve(capData.CapturedImage);

            capCalc.ForegroundDetectorC.Apply(capData.CapturedImage, capData.ForegroundImage);

            //update the motion history
            capCalc.MotionHistoryC.Update(capData.ForegroundImage);

            #region get a copy of the motion mask and enhance its color
            double[] minValues, maxValues;
            Point[] minLoc, maxLoc;
            capCalc.MotionHistoryC.Mask.MinMax(out minValues, out maxValues, out minLoc, out maxLoc);
            Mat motionMask = new Mat();
            using (ScalarArray sa = new ScalarArray(255.0 / maxValues[0]))
                CvInvoke.Multiply(capCalc.MotionHistoryC.Mask, sa, motionMask, 1, DepthType.Cv8U);
            //Image<Gray, Byte> motionMask = _motionHistory.Mask.Mul(255.0 / maxValues[0]);
            #endregion

            //create the motion image
            //Mat motionImage = new Mat(motionMask.Size.Height, motionMask.Size.Width, DepthType.Cv8U, 3);
            capData.MotionImage = new Mat(motionMask.Size.Height, motionMask.Size.Width, DepthType.Cv8U, 3);

            //display the motion pixels in blue (first channel)
            //motionImage[0] = motionMask;
            CvInvoke.InsertChannel(motionMask, capData.MotionImage, (int)Constants.ColorChannel.Blue);

            //Threshold to define a motion area, reduce the value to detect smaller motion
            double minArea = Constants.MIN_DECTIVED_AREA;

            //storage.Clear(); //clear the storage
            //Rectangle[] rects;

            Mat segMask = new Mat();
            using (VectorOfRect boundingRect = new VectorOfRect())
            {
                capCalc.MotionHistoryC.GetMotionComponents(segMask, boundingRect);
                capData.CapturedMotionData.Rects = boundingRect.ToArray();
            }

            double[] angles = new double[capData.CapturedMotionData.Rects.Length];
            double[] motionPixelArr = new double[capData.CapturedMotionData.Rects.Length];
            uint index = 0;
            //iterate through each of the motion component
            foreach (Rectangle comp in capData.CapturedMotionData.Rects)
            {
                int area = comp.Width * comp.Height;
                //reject the components that have small area;
                if (area < minArea)
                    continue;

                // find the angle and motion pixel count of the specific area
                double angle = 0;
                double motionPixelCount = 0;
                capCalc.MotionHistoryC.MotionInfo(capData.ForegroundImage, comp, out angle, out motionPixelCount);

                //reject the area that contains too few motion
                if (motionPixelCount < area * Constants.MIN_MOTION_PIXEL_RATIO_IN_AN_AREA)
                    continue;

                angles[index] = angle;
                motionPixelArr[index] = motionPixelCount;
                index++;
                //Draw each individual motion in red
                DrawMotion(capData.MotionImage, comp, angle, new Bgr(Color.Red));
            }

            // find and draw the overall motion angle
            double overallAngle, overallMotionPixelCount;

            capCalc.MotionHistoryC.MotionInfo(capData.ForegroundImage, new Rectangle(Point.Empty, motionMask.Size), out overallAngle, out overallMotionPixelCount);
            capData.CapturedMotionData.OverallAngle = overallAngle;
            capData.CapturedMotionData.OverallMotionPixelCount = overallMotionPixelCount;
            capData.CapturedMotionData.Angles = angles;
            capData.CapturedMotionData.MotionPixelCountArray = motionPixelArr;

            DrawMotion(capData.MotionImage, new Rectangle(Point.Empty, motionMask.Size), capData.CapturedMotionData.OverallAngle, new Bgr(Color.Green));

            return capData;
        }
コード例 #2
0
ファイル: MotionDetective.cs プロジェクト: Lionel1204/MyCode
        private void startButton_Click(object sender, EventArgs e)
        {
            _destVideoFilePath = string.Empty;
            _log.Error("destVideo_Click");
            if (!chkUseCamera.Checked)
            {
                OpenFileDialog fileDialog = new OpenFileDialog
                {
                    Multiselect = false,
                    Title = "请选择文件",
                    Filter = "所有文件(*.*)|*.*"
                };

                if (fileDialog.ShowDialog() == DialogResult.OK)
                {
                    _destVideoFilePath = fileDialog.FileName;
                }
                else
                {
                    return;
                }
            }

            _capCalcOrig = new CaptureCalc();
            _capCalcDest = new CaptureCalc();

            _capDataOrig = new CaptureData();
            _capDataDest = new CaptureData();

            _redis = ConnectionMultiplexer.Connect(_redisHost);
            if (_redis == null)
                return;

            _db = _redis.GetDatabase();

            if (_db == null)
                return;

            _db.StringSet(Constants.REDIS_KEY_CAPTURED_DATA, "");
            _db.StringSet(Constants.REDIS_KEY_OIRG_DATA, "");
            //RedisValue rv= _db.StringGet("CapturedData");
            //try to create the capture
            if (_capCalcDest.CaptureC == null)
            {
                try
                {
                    _capCalcDest.CaptureC = !string.IsNullOrEmpty(_destVideoFilePath) ? new Capture(_destVideoFilePath) : new Capture();
                }
                catch (NullReferenceException ex)
                {
                    //show errors if there is any
                    MessageBox.Show(ex.Message);
                }
            }
            if (_capCalcOrig.CaptureC == null)
            {
                try
                {
                    if (!string.IsNullOrEmpty(_origVideoFilePath))
                        _capCalcOrig.CaptureC = new Capture(_origVideoFilePath);
                }
                catch (NullReferenceException ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            if (_capCalcDest.CaptureC != null) //if camera capture has been successfully created
            {
                _capCalcDest.ForegroundDetectorC = new BackgroundSubtractorMOG2();

                _capCalcDest.MotionHistoryC = new MotionHistory(
                    1.0, //in second, the duration of motion history you wants to keep
                    0.05, //in second, maxDelta for cvCalcMotionGradient
                    0.5); //in second, minDelta for cvCalcMotionGradient

                _capCalcDest.CaptureC.ImageGrabbed += ProcessCapturedFrame;
                _capCalcDest.CaptureC.Start();
            }

            if (_capCalcOrig.CaptureC != null) //if camera capture has been successfully created
            {
                _capCalcOrig.ForegroundDetectorC = new BackgroundSubtractorMOG2();

                _capCalcOrig.MotionHistoryC = new MotionHistory(
                    1.0, //in second, the duration of motion history you wants to keep
                    0.05, //in second, maxDelta for cvCalcMotionGradient
                    0.5); //in second, minDelta for cvCalcMotionGradient

                _capCalcOrig.CaptureC.ImageGrabbed += ProcessComparedVideoFrame;
                _capCalcOrig.CaptureC.Start();
            }
        }