/// <summary>
        /// Загрузка одного кадра (с изображения)
        /// </summary>
        /// <param name="data">Информация о кадре</param>
        /// <returns>Кадр</returns>
        public Task<GreyVideoFrame> LoadFrameAsync(object data)
        {
            try
            {
                if (data == null)
                    throw new ArgumentNullException("Null data in LoadFrameAsync");
                IOData ioData = (IOData)data;
                string frameFileName = ioData.FileName;
                if (frameFileName == null || frameFileName.Length == 0)
                    throw new ArgumentNullException("Null frameFileName in LoadFrameAsync");
                if (ioData.FrameHeight <= 0)
                    throw new ArgumentException("Error frameHeight value in LoadFrameAsync");
                if (ioData.FrameWidth <= 0)
                    throw new ArgumentException("Error frameWidth value in LoadFrameAsync");

                return Task.Run(() =>
                {
                    Size size = new Size(ioData.FrameWidth, ioData.FrameHeight);
                    Bitmap bitmapFrame = new Bitmap(frameFileName);

                  //  bitmapFrame.SetResolution(ioData.FrameWidth, ioData.FrameHeight);
                    BitmapConvertor bitmapConvertor = new BitmapConvertor();
                    GreyVideoFrame greyVideoFrame = new GreyVideoFrame();

                    greyVideoFrame.Frame = bitmapConvertor.ToGreyImage(bitmapFrame);
                    return greyVideoFrame;
                });
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
        /// <summary>
        /// Поиск ключевых кадров видео
        /// </summary>
        /// <param name="frames">Все серые кадры</param>
        /// <param name="coloredFrames">Все цветные кадры</param>
        /// <param name="framesDifferences">Разницы кадров</param>
        /// <param name="treshold">Порог</param>
        /// <returns>Ключевые кадры</returns>
        private List<GreyVideoFrame> GetKeyFrames(List<Image<Gray, Byte>> frames, List<Image<Bgr, Byte>> coloredFrames,
            List<int> framesDifferences, double treshold)
        {
            try
            {
                ImageConvertor imageConvertor = new ImageConvertor();

                List<GreyVideoFrame> keyFrames = new List<GreyVideoFrame>();
                GreyVideoFrame firstKeyFrame = new GreyVideoFrame();
                firstKeyFrame.FrameNumber = 0;
                firstKeyFrame.Frame = imageConvertor.ConvertColor(frames[0]);
                keyFrames.Add(firstKeyFrame);

                int framesDifferencesNumber = framesDifferences.Count;
                int previousFrameNumber = 0;
                for (int i = 0; i < framesDifferencesNumber; i++)
                {
                    if (framesDifferences[i] > treshold && i + 1 != previousFrameNumber + 1)
                    {
                        GreyVideoFrame keyFrame = new GreyVideoFrame();
                        keyFrame.FrameNumber = i + 1;
                        previousFrameNumber = i + 1;
                        keyFrame.OriginalFrame = coloredFrames[i + 1];
                        keyFrame.Frame = imageConvertor.ConvertColor(frames[i + 1]);
                        keyFrames.Add(keyFrame);
                    }
                    if (i == framesDifferencesNumber - 1)
                        keyFrameExtractedEvent(i, i + 1, true);
                    else
                        keyFrameExtractedEvent(i, i + 1, false);
                }
                return keyFrames;
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
        /// <summary>
        /// Добавление ключевого кадра в список ключевых кадров
        /// </summary>
        /// <param name="keyFrames">Список клбючевых кадров</param>
        /// <param name="frame">Ключевой кадр</param>
        /// <param name="frameFileName">Имя файла для сохранения ключевого кадра</param>
        /// <param name="frameNumber">Номер ключевого кадра</param>
        /// <param name="needProcess">Нуждается ли кадр в обработке</param>
        private void AddKeyFrameFunction(List<GreyVideoFrame> keyFrames, Image<Gray, Byte> frame, string frameFileName, int frameNumber,
            bool needProcess)
        {
            try
            {
                frame.Save(frameFileName);
                Bitmap bitmapFrame = new Bitmap(frameFileName);

                GreyVideoFrame keyFrame = new GreyVideoFrame();
                keyFrame.FrameNumber = frameNumber;
                BitmapConvertor bitmapConvertor = new BitmapConvertor();
                keyFrame.Frame = bitmapConvertor.ToGreyImage(bitmapFrame);
                keyFrame.NeedProcess = needProcess;
                keyFrames.Add(keyFrame);
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Сохранение одного кадра видео
        /// </summary>
        /// <param name="videoFrame"></param>
        /// <param name="pen"></param>
        /// <param name="saveFileName"></param>
        public Task<bool> SaveVideoFrameAsync(GreyVideoFrame videoFrame, System.Drawing.Pen pen, string saveFileName)
        {
            try
            {
                if (videoFrame == null || videoFrame.Frame == null)
                    throw new ArgumentNullException("Null videoFrame");
                if (saveFileName == null || saveFileName.Length == 0)
                    throw new ArgumentNullException("Null saveFileName");
                if (pen == null)
                    throw new ArgumentNullException("Null pen");

                return Task.Run(() =>
                {
                    BitmapConvertor bitmapConvertor = new BitmapConvertor();
                    Bitmap bitmapFrame = bitmapConvertor.ToBitmap(videoFrame.Frame);

                    Draw.DrawTextBoundingBoxes(bitmapFrame, videoFrame.Frame.TextRegions, pen);
                    bitmapFrame.Save(saveFileName);

                    return true;
                });
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
Esempio n. 5
0
 /// <summary>
 /// Запись инфориации о текстовых блоках кадра видеопотока в XML - файл 
 /// </summary>
 /// <param name="videoFrame">Фрейм видео</param>
 /// <param name="fileName">Имя файла</param>
 /// <returns>true</returns>
 public static Task<bool> WriteTextBlocksInformation(GreyVideoFrame videoFrame, string fileName)
 {
     if (videoFrame == null)
         throw new ArgumentNullException("Null videoFrame in WriteTextBlocksInformation");
     if (fileName == null || fileName.Length == 0)
         throw new ArgumentNullException("Null fileName in WriteTextBlocksInformation");
     try
     {
         return Task.Run(() =>
         {
             XmlWriterSettings settings = new XmlWriterSettings();
             settings.Indent = true;
             settings.IndentChars = "\t";
             XmlWriter xmlWriter = XmlWriter.Create(fileName, settings);
             xmlWriter.WriteStartDocument();
             xmlWriter.WriteStartElement("Video");
             XMLWriter.WriteTextBlocksInformation(videoFrame.Frame.TextRegions, xmlWriter, videoFrame.FrameNumber, fileName);
             xmlWriter.WriteEndDocument();
             xmlWriter.Flush();
             xmlWriter.Close();
             return true;
         });
     }
     catch (Exception exception)
     {
         throw exception;
     }
 }
        /// <summary>
        /// Выяснение, есть ли неопределенные параметры у кадра (эвристки)
        /// </summary>
        /// <param name="videoFrame">Кард</param>
        /// <returns>1 - есть неопределенные параметр(ы), 0 - иначе</returns>
        private bool ParametersUndefined(GreyVideoFrame videoFrame)
        {
            try
            {
                bool result = false;
                int undefinedParameter = GreyVideoFrame.UNDEFINED_PARAMETER;

                if (videoFrame.AspectRatio == undefinedParameter || videoFrame.BbPixelsNumberMaxRatio == undefinedParameter ||
                    videoFrame.BbPixelsNumberMinRatio == undefinedParameter || videoFrame.DiamiterSWRatio == undefinedParameter ||
                    videoFrame.ImageRegionHeightRationMin == undefinedParameter || videoFrame.ImageRegionWidthRatioMin == undefinedParameter ||
                    videoFrame.PairsHeightRatio == undefinedParameter || videoFrame.PairsIntensityRatio == undefinedParameter ||
                    videoFrame.PairsOccupationRatio == undefinedParameter || videoFrame.PairsSWRatio == undefinedParameter ||
                    videoFrame.PairsWidthDistanceSqrRatio == undefinedParameter || videoFrame.VarienceAverageSWRation == undefinedParameter)
                    return true;
                return result;
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
        /// <summary>
        /// Выделение текста на единичном кадре видеопотока
        /// </summary>
        /// <param name="videoFrame">Кадр видео</param>
        /// <returns>true</returns>
        public Task<bool> DetectText(GreyVideoFrame videoFrame, int threadsNumber)
        {
            try
            {
                if (videoFrame == null || videoFrame.Frame == null)
                    throw new ArgumentNullException("Null frame in DetectText");

                return Task.Run(() =>
                {
                    if (videoFrame.NeedProcess)
                    {
                        EdgeDetectionFilter sobel = new SobelFilter();
                        GradientFilter gradientFiler = new SimpleGradientFilter();
                        SmoothingFilter gauss = null; //new GaussFilter(this.GaussFilterSize, this.GaussFilterSigma);
                        SmoothingFilter gaussForCanny = null;

                        SWTTextDetection sWTTextDetection = null;
                        if (ParametersUndefined(videoFrame))
                        {
                            if (this.UseAdaptiveSmoothing)
                                gaussForCanny = new AdaptiveGaussFilter(this.GaussFilterSigma);
                            else
                                gaussForCanny = new GaussFilter(this.GaussFilterSize, this.GaussFilterSigma);
                            gauss = new GaussFilter(this.GaussFilterSize, this.GaussFilterSigma);
                            CannyEdgeDetection canny = new CannyEdgeDetection(gaussForCanny, sobel, this.CannyLowTreshold, this.CannyHighTreshold);

                            sWTTextDetection = new SWTTextDetection(canny, gauss, gradientFiler, this.VarienceAverageSWRation,
                                            this.AspectRatio, this.DiamiterSWRatio, this.BbPixelsNumberMinRatio, this.BbPixelsNumberMaxRatio, this.ImageRegionHeightRationMin,
                                            this.ImageRegionWidthRatioMin, this.PairsHeightRatio, this.PairsIntensityRatio, this.PairsSWRatio,
                                            this.PairsWidthDistanceSqrRatio, this.PairsOccupationRatio, this.MinLettersNumberInTextRegion, this.MergeByDirectionAndChainEnds);
                        }
                        else
                        {
                            if (videoFrame.UseAdaptiveSmoothing)
                                gaussForCanny = new AdaptiveGaussFilter(videoFrame.GaussFilterSigma);
                            else
                                gaussForCanny = new GaussFilter(videoFrame.GaussFilterSize, videoFrame.GaussFilterSigma);
                            gauss = new GaussFilter(videoFrame.GaussFilterSize, videoFrame.GaussFilterSigma);
                            CannyEdgeDetection canny = new CannyEdgeDetection(gaussForCanny, sobel, videoFrame.CannyLowTreshold, videoFrame.CannyHighTreshold);

                            sWTTextDetection = new SWTTextDetection(canny, gauss, gradientFiler, videoFrame.VarienceAverageSWRation, videoFrame.AspectRatio,
                                videoFrame.DiamiterSWRatio, videoFrame.BbPixelsNumberMinRatio, videoFrame.BbPixelsNumberMaxRatio, videoFrame.ImageRegionHeightRationMin,
                                videoFrame.ImageRegionWidthRatioMin, videoFrame.PairsHeightRatio, videoFrame.PairsIntensityRatio, videoFrame.PairsSWRatio,
                                videoFrame.PairsWidthDistanceSqrRatio, videoFrame.PairsOccupationRatio, videoFrame.MinLettersNumberInTextRegion, videoFrame.MergeByDirectionAndChainEnds);
                        }
                        sWTTextDetection.DetectText(videoFrame.Frame, threadsNumber);
                    }
                    return true;
                });
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
        private void AddProcessedFrameToBitmapArray(GreyVideoFrame videoFrame)
        {
            try
            {
                if (this.processedVideoFramesBitmap == null)
                    this.processedVideoFramesBitmap = new List<BitmapImage>();
                if (this.processedVideoFramesBitmapForSave == null)
                    this.processedVideoFramesBitmapForSave = new List<Bitmap>();
                if (this.textRegionsDictionary == null)
                    this.textRegionsDictionary = new Dictionary<int, List<TextRegion>>();

                this.textRegionsDictionary.Add(videoFrame.FrameNumber, videoFrame.Frame.TextRegions);

                BitmapConvertor bitmapConvertor = new BitmapConvertor();
                BitmapImageConvertor bitmapImageConvertor = new Convertors.BitmapImageConvertor();

                Bitmap bitmapFrame = bitmapConvertor.ToBitmap(videoFrame.Frame);
                Draw.DrawTextBoundingBoxes(bitmapFrame, videoFrame.Frame.TextRegions, new System.Drawing.Pen(System.Drawing.Color.Red, 2));
                this.processedVideoFramesBitmapForSave.Add(bitmapFrame);
                this.processedVideoFramesBitmap.Add(bitmapImageConvertor.BitmapToBitmapImage(bitmapFrame));      
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
        /// <summary>
        /// Загрузка единичного кадра видео 
        /// </summary>
        private async void LoadVideoFrameFunction()
        {
            try
            {
                OpenFileDialog dialog = new OpenFileDialog();
                dialog.Filter = "JPEG Image (.jpg)|*.jpg";
                dialog.ShowDialog();

                FrameSizeWindow frameSizeWindow = FrameSizeWindow.InitializeFrameSizeWindow();
                frameSizeWindow.capitalText.Text = PARAMETERS_SETTING_STRING;
                frameSizeWindow.ShowDialog();

                FrameSizeViewModel frameSizeViewModel = (FrameSizeViewModel)frameSizeWindow.DataContext;

                IOData ioData = new IOData() { FileName = dialog.FileName, FrameHeight = frameSizeViewModel.FrameHeight, FrameWidth = frameSizeViewModel.FrameWidth };
                VideoLoader.frameLoadedEvent += this.LoadingFramesProcessing;
                VideoLoader videoLoader = new VideoLoader();

                FrameLoader frameLoader = new FrameLoader();
                videoFrame = await frameLoader.LoadFrameAsync(ioData);

                OkButtonWindow okButtonWindow = OkButtonWindow.InitializeOkButtonWindow();
                okButtonWindow.textInformation.Text = LOAD_FRAME_SUCCESS_STRING;
                okButtonWindow.capitalText.Text = LOAD_FRAME_STRING;
                okButtonWindow.ShowDialog();

                Bitmap bitmapFrame = new Bitmap(dialog.FileName);
                BitmapImageConvertor bitmapImageConvertor = new Convertors.BitmapImageConvertor();
                this.FrameSource = bitmapImageConvertor.BitmapToBitmapImage(bitmapFrame);
                this.ProcessedFrameSource = null;

                this.IsVideoFrameTabSelected = true;
                this.IsProcessedVideoFramesTabSelected = false;
                this.IsProcessedVideoFrameTabSelected = false;
                this.IsVideoTabSelected = false;
            }
            catch (Exception exception)
            {
                ShowExceptionMessage(exception.Message);
            }
        }
Esempio n. 10
0
        /// <summary>
        /// Создание кадра видео 
        /// </summary>
        /// <param name="frame">Кадр</param>
        /// <param name="keyFrameIOInformation">Информация о кадре</param>      
        /// <returns>Кадр</returns>
        private GreyVideoFrame CreateVideoFrame(Image<Gray, byte> frame, KeyFrameIOInformation keyFrameIOInformation)
        {
            try
            {
              //  Bitmap bitmapFrame = new Bitmap(frameFileName);

                ImageConvertor ImageConvertor = new DigitalVideoProcessingLib.IO.ImageConvertor();

                GreyVideoFrame keyFrame = new GreyVideoFrame();
                keyFrame.FrameNumber = keyFrameIOInformation.Number;
                BitmapConvertor bitmapConvertor = new BitmapConvertor();

                keyFrame.Frame = ImageConvertor.ConvertColor(frame);//bitmapConvertor.ToGreyImage(bitmapFrame);

                keyFrame.NeedProcess = keyFrameIOInformation.NeedProcess;
                keyFrame.AspectRatio = keyFrameIOInformation.AspectRatio;
                keyFrame.BbPixelsNumberMaxRatio = keyFrameIOInformation.BbPixelsNumberMaxRatio;
                keyFrame.BbPixelsNumberMinRatio = keyFrameIOInformation.BbPixelsNumberMinRatio;
                keyFrame.DiamiterSWRatio = keyFrameIOInformation.DiamiterSWRatio;
                keyFrame.ImageRegionHeightRationMin = keyFrameIOInformation.ImageRegionHeightRationMin;
                keyFrame.ImageRegionWidthRatioMin = keyFrameIOInformation.ImageRegionWidthRatioMin;
                keyFrame.MergeByDirectionAndChainEnds = keyFrameIOInformation.MergeByDirectionAndChainEnds;
                keyFrame.MinLettersNumberInTextRegion = keyFrameIOInformation.MinLettersNumberInTextRegion;
                keyFrame.PairsHeightRatio = keyFrameIOInformation.PairsHeightRatio;
                keyFrame.PairsIntensityRatio = keyFrameIOInformation.PairsIntensityRatio;
                keyFrame.PairsOccupationRatio = keyFrameIOInformation.PairsOccupationRatio;
                keyFrame.PairsSWRatio = keyFrameIOInformation.PairsSWRatio;
                keyFrame.PairsWidthDistanceSqrRatio = keyFrameIOInformation.PairsWidthDistanceSqrRatio;
                keyFrame.UseAdaptiveSmoothing = keyFrameIOInformation.UseAdaptiveSmoothing;
                keyFrame.VarienceAverageSWRation = keyFrameIOInformation.VarienceAverageSWRation;
                keyFrame.GaussFilterSize = keyFrameIOInformation.GaussFilterSize;
                keyFrame.GaussFilterSigma = keyFrameIOInformation.GaussFilterSigma;
                keyFrame.CannyLowTreshold = keyFrameIOInformation.CannyLowTreshold;
                keyFrame.CannyHighTreshold = keyFrameIOInformation.CannyHighTreshold;
                return keyFrame;
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }