//получение номера серии через с помощью масштабирования страницы с разным шагом(исп-ть, если не находит на исходном масштабе) //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); }
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, ""); } }
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); }
//получение всех данные по странице с помощью масштабирования страницы с разным шагом(исп-ть, если не находит на исходном масштабе) //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(); }