예제 #1
0
        //получение номера серии через с помощью масштабирования страницы с разным шагом(исп-ть, если не находит на исходном масштабе)
        //sourceImage = входное изображение, stepScale = шаг масштабирования, amountOfSteps = кол-во проходов рескейлинга
        public string getSeriaNumberViaRescaling(Image sourceImage, float stepScale, int amountOfSteps)
        {
            //подключаем распознаватель
            TesseractEngine ocrRus = new TesseractEngine("./tessdata", "rus", EngineMode.Default);
            TesseractEngine ocrEng = new TesseractEngine("./tessdata", "eng", EngineMode.Default);

            //создаем графический фильтр
            TResizeTool resizeTool = new TResizeTool();

            //ставим методику распознавания страницы
            PageSegMode pSegMode = PageSegMode.SparseText;

            string seriaNumber = "";

            float scaleValue = 1.0f;//исходный масштаб

            List <string> seriaList = new List <string>();

            for (int k = 1; k <= amountOfSteps; k++)
            {
                //по индексу отмасш-й страницы берем исходную(без масштаба)
                Image img = sourceImage;

                int newWidth  = Convert.ToInt32((img.Width) * ((k * stepScale) + scaleValue));
                int newHeight = Convert.ToInt32((img.Height) * ((k * stepScale) + scaleValue));

                Bitmap imgBitmap = resizeTool.resizeImage(img, newWidth, newHeight);

                Image rescaledPage = ((Image)imgBitmap);

                string rescaledPageTextRus = "";
                string rescaledPageTextEng = "";

                //удаляем процесс, чтобы не было ошибки
                using (var pageRus = ocrRus.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextRus = pageRus.GetText();
                }

                //удаляем процесс, чтобы не было ошибки
                using (var pageEng = ocrEng.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextEng = pageEng.GetText();
                }

                seriaList.Add(getSeriaNumber(rescaledPageTextRus, rescaledPageTextEng));
            }

            seriaNumber = highestMatch(seriaList);

            ocrRus.Dispose();
            ocrEng.Dispose();

            return(seriaNumber);
        }
예제 #2
0
        private void OcrBtn_Click(object sender, EventArgs e)
        {
            try {
                if (docFilePath == "")
                {
                    folderBrowserDialog.ShowDialog();
                }
                {
                    //if(true)
                    //чистим объекты формы
                    textBox.Text         = "";
                    isDoneProcLabel.Text = "";

                    Dictionary <string, string> words = null;

                    //инициализируем словарь транслитеризации
                    initDictionary(ref words);

                    //folderBrowserDialog.SelectedPath = "C:\\Users\\YashuninAM\\Desktop\\[ПО]Разработка\\[ПО]Распознаватель_сертов_и_приложений\\2\\Сертификаты\\Сертификаты\\Test";
                    //folderBrowserDialog.SelectedPath = "C:\\Users\\YashuninAM\\Desktop\\[ПО]Разработка\\[ПО]Распознаватель_сертов_и_приложений\\2\\Сертификаты\\Сертификаты\\Test_debug";
                    //folderBrowserDialog.SelectedPath = @"C:\Users\YashuninAM\Desktop\[ПО]Разработка\[ПО]Распознаватель_сертов_и_приложений\2\Сертификаты\Сертификаты\[ПРОММАШТЕСТ]Test_Debug";
                    //folderBrowserDialog.SelectedPath = @"C:\Users\Alexey\Desktop\[ПРОММАШТЕСТ]Test_Debug";

                    //создаем pdf конвертер
                    TPDFConverter pdfConverter = new TPDFConverter();

                    //для записи Image'й в файл
                    TFileWriter fileWriter = new TFileWriter();

                    //создаем графические фильтры
                    TCropTool   cropTool   = new TCropTool();
                    TResizeTool resizeTool = new TResizeTool();

                    //создаем поисковик
                    TTeseract_OCR tesOCR = new TTeseract_OCR();

                    //забираем кол-во тасков
                    if (Tasks_amount_txtbox.Text != "")
                    {
                        delimTaskValue = Convert.ToInt32(Tasks_amount_txtbox.Text);

                        abbyOCR = new TABBYFineReader(delimTaskValue);//ставим значение от delimTaskValue (в коде ниже)
                    }
                    else
                    {
                        abbyOCR = new TABBYFineReader(delimTaskValue);//ставим значение от delimTaskValue (в коде ниже)
                    }

                    //контейнеры для обработанных изображений
                    List <Image> imagePdfPages    = null;
                    List <Image> imageCropPages   = new List <Image>();
                    List <Image> imageScaledPages = new List <Image>();

                    //задаем выходной формат изображения
                    System.Drawing.Imaging.ImageFormat imgFormat = System.Drawing.Imaging.ImageFormat.Png;

                    //удаляем старые выходные данные
                    string currentPath = System.IO.Directory.GetCurrentDirectory();

                    //сохраняем путь к папке входных данных
                    string inputFolder = folderBrowserDialog.SelectedPath;

                    //получаем название папки для дальнейшего экспорта содержимого
                    string folderName = "";

                    if (docFilePath == "")
                    {
                        folderName = Path.GetFileName(Path.GetDirectoryName(folderBrowserDialog.SelectedPath + "\\"));
                    }
                    else
                    {
                        string filePath = (File.ReadAllLines(docFilePath)[0]);
                        folderName = Path.GetFileName(Path.GetDirectoryName(filePath));
                    }

                    string outFilePath = currentPath + "\\[OUT]Data\\" + folderName;
                    //string outFilePath = @"\\msk-dc01-elma1p\elmabin\cert archive\\" + folderName;

                    //создаем папку для выходных документов pdf
                    System.IO.Directory.CreateDirectory(outFilePath);

                    //создаем папку для текущего документа
                    System.IO.Directory.CreateDirectory(currentPath + "\\[OUT]Data\\");

                    //пишем список оставшихся файлов для распознания, если упало
                    string outCrashFolder = currentPath + "\\[Crash]Log";

                    if (System.IO.Directory.Exists(outCrashFolder))
                    {
                        System.IO.Directory.Delete(outCrashFolder, true);
                    }

                    System.IO.Directory.CreateDirectory(outCrashFolder);

                    //составляем список pdf файлов
                    if (docFilePath != "")
                    {
                        string[] lines = File.ReadAllLines(docFilePath, Encoding.UTF8);

                        fileNames = new List <string>();

                        for (int i = 0; i < lines.Length; i++)
                        {
                            fileNames.Add(lines[i]);
                        }
                    }
                    else
                    {
                        fileNames = getPdfFiles(inputFolder);
                    }

                    //устанавливаем предел прогресс-бара
                    processProgressBar.Maximum = fileNames.Count;

                    //рендерим, распознаем, сохраняем документы
                    for (int i = 0; i < fileNames.Count; i++)
                    {
                        //пишем текущий файл в документ для последующего учета
                        if (File.Exists(currentPath + "\\[OUT]Data\\Current_file.txt") == true)
                        {
                            File.Delete(currentPath + "\\[OUT]Data\\Current_file.txt");
                        }

                        System.IO.File.WriteAllText(currentPath + "\\[OUT]Data\\Current_file.txt", fileNames[i]);

                        //сохраняем индекс для аварийного случая
                        curIndFileNames = i;

                        //чтобы система успевала обработать запросы и других COM-библиотек
                        Application.DoEvents();

                        //читаем pdf документ и рендерим в imag'ы
                        try {
                            imagePdfPages = pdfConverter.pdfToImage(fileNames[i], 300, 3.0f);

                            //throw new System.ArgumentException("Parameter cannot be null", "original");
                        } catch (System.Exception error) {
                            //сохраняем название проблемного файла

                            saveErrorFile(error, fileNames[i]);

                            continue;
                        }

                        ////////////////////////////////////////////////////////////////////////////
                        //вырезаем верхнюю часть страницы(20%) и сохраняем отдельно
                        float cropValue        = 0.09f;
                        float cropHeightOffset = 0.08f;

                        for (int j = 0; j < imagePdfPages.Count; j++)
                        {
                            Image img = imagePdfPages[j];

                            int imgCropHeight       = Convert.ToInt32((img.Height) * (cropValue));
                            int imgCropHeightOffset = Convert.ToInt32((img.Height) * (cropHeightOffset));

                            Rectangle imgCropRect = new Rectangle(0, imgCropHeightOffset, img.Width, imgCropHeight);

                            img = cropTool.cropImage(img, imgCropRect);

                            imagePdfPages[j] = img;
                        }

                        ////////////////////////////////////////////////////////////////////////////
                        //увеличиваем размер входного изображения(т.е масштабируем)
                        float scaleValue = 1.5f;// начинаем с 50%

                        for (int j = 0; j < imagePdfPages.Count; j++)
                        {
                            Image img = imagePdfPages[j];

                            int newWidth  = Convert.ToInt32((img.Width) * (scaleValue));
                            int newHeight = Convert.ToInt32((img.Height) * (scaleValue));

                            Bitmap imgBitmap = resizeTool.resizeImage(img, newWidth, newHeight);

                            imageScaledPages.Add((Image)imgBitmap);
                        }

                        //создаем список задач
                        ocrTasks = new Task[imagePdfPages.Count];

                        //проходим по страницам документа
                        List <pdfPageInfo> infoPages = new List <pdfPageInfo>(imagePdfPages.Count);//информация по страницам pdf

                        //распознаем страницы
                        for (int j = 0; j < imageScaledPages.Count; j++)
                        {
                            object arg = j;

                            ocrTasks[j] = new Task(() => ocrImage(ref imagePdfPages, ref imageScaledPages, ref infoPages, arg));
                        }

                        /*//кол-во тасков, запускаемых одновременно
                         * int delimTaskValue=2;*/

                        //запускаем таски
                        for (int j = 0; j < ocrTasks.Length; j++)
                        {
                            if (((j + 1) % delimTaskValue == 0))
                            {
                                Task[] delimTasks = new Task[delimTaskValue];

                                for (int k = 0; k < delimTaskValue; k++)
                                {
                                    delimTasks[k] = ocrTasks[(j + 1) - delimTaskValue + k];
                                }

                                for (int k = 0; k < delimTaskValue; k++)
                                {
                                    delimTasks[k].Start();
                                }

                                //ждем завершения всех тасков
                                Task.WaitAll(delimTasks);

                                //удаляем следы FineReader'а
                                abbyOCR.destroyFRProcess();
                            }

                            //ocrTasks[j].Start();
                        }

                        //разбираем остаточную страницу(если есть)
                        int ostatokPages = (ocrTasks.Length % 2);

                        if (ostatokPages != 0)
                        {
                            ocrTasks[ocrTasks.Length - 1].Start();
                            ocrTasks[ocrTasks.Length - 1].Wait();
                        }

                        //ждем завершения всех тасков
                        //Task.WaitAll(ocrTasks);

                        //если документ состоит из сертификата и приложений, то сохраняем
                        if (infoPages.Count > 0)
                        {
                            //сохраняем документы
                            fileWriter.exportSertificatesAndPrilozenia(fileNames[i], outFilePath, infoPages);
                        }

                        //throw new ArgumentNullException();//для отладки лога
                        //пишем лог
                        if (textBox.Text == "")
                        {
                            string textBoxStrTemp = "[" + (i + 1) + "] = " + fileNames[i] + "\n";
                            textBox.Text = textBoxStrTemp.Replace("\n", Environment.NewLine);
                        }
                        else
                        {
                            string textBoxStr = textBox.Text + "\n[" + (i + 1) + "] = " + fileNames[i] + "\n";
                            textBox.Text = textBoxStr.Replace("\n", Environment.NewLine);
                        }

                        processProgressBar.Value += 1;

                        //обновляем форму
                        this.Refresh();
                        Application.DoEvents();

                        //чистим infoPages
                        infoPages.Clear();

                        //чистим контейнеры с изображениями, поскольку размеры контейнеров равны, то берем один из двух
                        for (int j = 0; j < imagePdfPages.Count; j++)
                        {
                            imagePdfPages[j].Dispose();
                            imageScaledPages[j].Dispose();
                        }

                        imagePdfPages.Clear();
                        imageScaledPages.Clear();

                        //удаляем временные файлы FineReader'а
                        abbyOCR.destroyOutFolders();

                        //удаляем следы FineReader'а
                        abbyOCR.destroyFRProcess();

                        //txtResult.Text = infoPage.fullNumber_;
                    }

                    //когда процесс закончен, то выводим уведомления
                    isDoneProcLabel.Text = "Done";
                    MessageBox.Show("Done");
                }
            } catch (Exception error) {
                saveErrorFile(error, "");
            }
        }
예제 #3
0
        public void getDataViaRescaling(Image sourceImage, ref Tesseract_OCR_Window.pdfPageInfo infoPage, ref Dictionary <string, string> replaceWords, float stepScale, int amountOfSteps)
        {
            //подключаем распознаватель
            TesseractEngine ocrRus = new TesseractEngine("./tessdata", "rus", EngineMode.Default);
            TesseractEngine ocrEng = new TesseractEngine("./tessdata", "eng", EngineMode.Default);

            //создаем графический фильтр
            TResizeTool resizeTool = new TResizeTool();

            //ставим методику распознавания страницы
            PageSegMode pSegMode = PageSegMode.SparseText;

            float scaleValue = 1.0f;//исходный масштаб

            List <string> seriaNumberList = new List <string>();
            List <string> countryList     = new List <string>();
            List <string> orgSertList     = new List <string>();
            List <string> shortNumberList = new List <string>();
            List <string> typeSeriaList   = new List <string>();

            for (int k = 0; k <= amountOfSteps; k++)
            {
                //по индексу отмасш-й страницы берем исходную(без масштаба)
                Image img = sourceImage;

                int newWidth  = Convert.ToInt32((img.Width) * ((k * stepScale) + scaleValue));
                int newHeight = Convert.ToInt32((img.Height) * ((k * stepScale) + scaleValue));

                Bitmap imgBitmap = resizeTool.resizeImage(img, newWidth, newHeight);

                Image rescaledPage = ((Image)imgBitmap);

                string rescaledPageTextRus = "";
                string rescaledPageTextEng = "";

                //удаляем процесс, чтобы не было ошибки
                using (var pageRus = ocrRus.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextRus = pageRus.GetText();
                }

                //удаляем процесс, чтобы не было ошибки
                using (var pageEng = ocrEng.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextEng = pageEng.GetText();
                }

                //набираем статистику для последующего поиска наибольшего соответствия
                string seriaNumber = getSeriaNumber(rescaledPageTextRus, rescaledPageTextEng);
                string country     = getCountry(rescaledPageTextEng);
                string orgSert     = getOrgSert(rescaledPageTextRus);
                string shortNumber = getShortNumber(rescaledPageTextRus);
                string typeSeria   = getTypeSeria(rescaledPageTextRus, rescaledPageTextEng, ref replaceWords);

                if (seriaNumber != "")
                {
                    seriaNumberList.Add(seriaNumber);//серия
                }

                if (country != "")
                {
                    countryList.Add(country);//страна
                }

                if (orgSert != "")
                {
                    orgSertList.Add(orgSert);//орган по сертификации
                }

                if (shortNumber != "")
                {
                    shortNumberList.Add(shortNumber);//shortNumber
                }

                if (typeSeria != "")
                {
                    typeSeriaList.Add(typeSeria);//тип серии
                }
            }

            ocrRus.Dispose();
            ocrEng.Dispose();

            //собираем данные для структуры infoPage
            infoPage.seriaNumber_ = highestMatch(seriaNumberList);
            infoPage.country_     = highestMatch(countryList);
            infoPage.orgSert_     = highestMatch(orgSertList);
            infoPage.shortNumber_ = highestMatch(shortNumberList);
            infoPage.typeSeria_   = highestMatch(typeSeriaList);
        }
예제 #4
0
        //получение всех данные по странице с помощью масштабирования страницы с разным шагом(исп-ть, если не находит на исходном масштабе)
        //sourceImage = входное изображение, stepScale = шаг масштабирования, amountOfSteps = кол-во проходов рескейлинга,
        //infoPage = ссылка на структуру для заполнения
        public void getData(Image sourceImage, ref Tesseract_OCR_Window.pdfPageInfo infoPage, ref Dictionary <string, string> replaceWords, float stepScale, int amountOfSteps)
        {
            //подключаем распознаватель
            TesseractEngine ocrRus = new TesseractEngine("./tessdata", "rus", EngineMode.Default);
            TesseractEngine ocrEng = new TesseractEngine("./tessdata", "eng", EngineMode.Default);

            //создаем графический фильтр
            TResizeTool resizeTool = new TResizeTool();

            //ставим методику распознавания страницы
            PageSegMode pSegMode = PageSegMode.SparseText;

            string seriaNumber = ""; //серия
            string country     = ""; //страна
            string orgSert     = ""; //организация
            string shortNumber = ""; //short number
            string typeSeria   = ""; //тип серии

            float scaleValue = 1.0f; //исходный масштаб

            for (int k = 0; k <= amountOfSteps; k++)
            {
                //по индексу отмасш-й страницы берем исходную(без масштаба)
                Image img = sourceImage;

                int newWidth  = Convert.ToInt32((img.Width) * ((k * stepScale) + scaleValue));
                int newHeight = Convert.ToInt32((img.Height) * ((k * stepScale) + scaleValue));

                Bitmap imgBitmap = resizeTool.resizeImage(img, newWidth, newHeight);

                Image rescaledPage = ((Image)imgBitmap);

                string rescaledPageTextRus = "";
                string rescaledPageTextEng = "";

                //удаляем процесс, чтобы не было ошибки
                using (var pageRus = ocrRus.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextRus = pageRus.GetText();
                }

                //удаляем процесс, чтобы не было ошибки
                using (var pageEng = ocrEng.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextEng = pageEng.GetText();
                }

                //собираем данные для структуры infoPage
                if (infoPage.seriaNumber_ == "")
                {
                    seriaNumber = getSeriaNumber(rescaledPageTextRus, rescaledPageTextEng);//серия

                    if (seriaNumber != "")
                    {
                        infoPage.seriaNumber_ = seriaNumber;
                    }
                }

                if (infoPage.country_ == "")
                {
                    country = getCountry(rescaledPageTextEng);

                    if (country != "")
                    {
                        infoPage.country_ = country;
                    }
                }

                if (infoPage.orgSert_ == "")
                {
                    orgSert = getOrgSert(rescaledPageTextRus);

                    if (orgSert != "")
                    {
                        infoPage.orgSert_ = orgSert;
                    }
                }

                if (infoPage.shortNumber_ == "")
                {
                    shortNumber = getShortNumber(rescaledPageTextRus);

                    if (shortNumber != "")
                    {
                        infoPage.shortNumber_ = shortNumber;
                    }
                }

                if (infoPage.typeSeria_ == "")
                {
                    typeSeria = getTypeSeria(rescaledPageTextRus, rescaledPageTextEng, ref replaceWords);

                    if (typeSeria != "")
                    {
                        infoPage.typeSeria_ = typeSeria;
                    }
                }
            }

            ocrRus.Dispose();
            ocrEng.Dispose();
        }