internal void Initialize(Bitmap bitmap, int pixelsIsSpace, bool rightToLeft, NOcrDb nOcrDb, VobSubOcr vobSubOcr) { _bitmap = bitmap; var nbmp = new NikseBitmap(bitmap); nbmp.ReplaceNonWhiteWithTransparent(); bitmap = nbmp.GetBitmap(); _bitmap2 = bitmap; _nocrChars = nOcrDb.OcrCharacters; _matchList = new List<VobSubOcr.CompareMatch>(); _vobSubOcr = vobSubOcr; int minLineHeight = 6; _imageList = NikseBitmapImageSplitter.SplitBitmapToLettersNew(nbmp, pixelsIsSpace, rightToLeft, Configuration.Settings.VobSubOcr.TopToBottom, minLineHeight); // _imageList = NikseBitmapImageSplitter.SplitBitmapToLetters(nbmp, pixelsIsSpace, rightToLeft, Configuration.Settings.VobSubOcr.TopToBottom); int index = 0; while (index < _imageList.Count) { ImageSplitterItem item = _imageList[index]; if (item.NikseBitmap == null) { listBoxInspectItems.Items.Add(item.SpecialCharacter); _matchList.Add(null); } else { nbmp = item.NikseBitmap; nbmp.ReplaceNonWhiteWithTransparent(); item.Y += nbmp.CropTopTransparent(0); nbmp.CropTransparentSidesAndBottom(0, true); nbmp.ReplaceTransparentWith(Color.Black); //get nocr matches Nikse.SubtitleEdit.Forms.VobSubOcr.CompareMatch match = vobSubOcr.GetNOcrCompareMatchNew(item, nbmp, nOcrDb, false, false); if (match == null) { listBoxInspectItems.Items.Add("?"); _matchList.Add(null); } else { listBoxInspectItems.Items.Add(match.Text); _matchList.Add(match); } } index++; } }
public string NocrFastCheck(Bitmap bitmap) { var nbmpInput = new NikseBitmap(bitmap); nbmpInput.ReplaceNonWhiteWithTransparent(); var matches = new List<CompareMatch>(); List<ImageSplitterItem> list = NikseBitmapImageSplitter.SplitBitmapToLetters(nbmpInput, (int)numericUpDownNumberOfPixelsIsSpaceNOCR.Value, checkBoxRightToLeft.Checked, Configuration.Settings.VobSubOcr.TopToBottom); foreach (ImageSplitterItem item in list) { if (item.NikseBitmap != null) { item.NikseBitmap.ReplaceTransparentWith(Color.Black); } } int index = 0; var expandSelectionList = new List<ImageSplitterItem>(); while (index < list.Count) { ImageSplitterItem item = list[index]; if (item.NikseBitmap == null) { matches.Add(new CompareMatch(item.SpecialCharacter, false, 0, null)); } else { CompareMatch match = null; var nbmp = item.NikseBitmap; int index2 = 0; int topMargin = item.Y - item.ParentY; foreach (NOcrChar oc in _nOcrDb.OcrCharacters) { if (Math.Abs(oc.Width - nbmp.Width) < 3 && Math.Abs(oc.Height - nbmp.Height) < 4 && Math.Abs(oc.MarginTop - topMargin) < 4) { // only very accurate matches bool ok = true; index2 = 0; while (index2 < oc.LinesForeground.Count && ok) { NOcrPoint op = oc.LinesForeground[index2]; foreach (Point point in op.ScaledGetPoints(oc, nbmp.Width, nbmp.Height)) { if (point.X >= 0 && point.Y >= 0 && point.X < nbmp.Width && point.Y < nbmp.Height) { Color c = nbmp.GetPixel(point.X, point.Y); if (c.A > 150 && c.R + c.G + c.B > NocrMinColor) { } else { Point p = new Point(point.X - 1, point.Y); if (p.X < 0) p.X = 1; c = nbmp.GetPixel(p.X, p.Y); if (nbmp.Width > 20 && c.A > 150 && c.R + c.G + c.B > NocrMinColor) { } else { ok = false; break; } } } } index2++; } index2 = 0; while (index2 < oc.LinesBackground.Count && ok) { NOcrPoint op = oc.LinesBackground[index2]; foreach (Point point in op.ScaledGetPoints(oc, nbmp.Width, nbmp.Height)) { if (point.X >= 0 && point.Y >= 0 && point.X < nbmp.Width && point.Y < nbmp.Height) { Color c = nbmp.GetPixel(point.X, point.Y); if (c.A > 150 && c.R + c.G + c.B > NocrMinColor) { Point p = new Point(point.X, point.Y); if (oc.Width > 19 && point.X > 0) p.X = p.X - 1; c = nbmp.GetPixel(p.X, p.Y); if (c.A > 150 && c.R + c.G + c.B > NocrMinColor) { ok = false; break; } } } } index2++; } if (ok) match = new CompareMatch(oc.Text, oc.Italic, 0, null); } } if (match == null) { matches.Add(new CompareMatch("*", false, 0, null)); } else // found image match { matches.Add(new CompareMatch(match.Text, match.Italic, 0, null)); if (match.ExpandCount > 0) index += match.ExpandCount - 1; } } index++; } return GetStringWithItalicTags(matches); }
static void NOcrThreadDoWork(object sender, DoWorkEventArgs e) { var p = (NOcrThreadParameter)e.Argument; e.Result = p; var nbmpInput = new NikseBitmap(p.Picture); nbmpInput.ReplaceNonWhiteWithTransparent(); var matches = new List<CompareMatch>(); int minLineHeight = p.NOcrLastLowercaseHeight; if (minLineHeight < 10) minLineHeight = 22; int maxLineHeight = p.NOcrLastUppercaseHeight; if (maxLineHeight < 10) minLineHeight = 80; List<ImageSplitterItem> list = NikseBitmapImageSplitter.SplitBitmapToLettersNew(nbmpInput, p.NumberOfPixelsIsSpace, p.RightToLeft, Configuration.Settings.VobSubOcr.TopToBottom, minLineHeight); foreach (ImageSplitterItem item in list) { if (item.NikseBitmap != null) { var nbmp = item.NikseBitmap; // nbmp.ReplaceNonWhiteWithTransparent(); item.Y += nbmp.CropTopTransparent(0); nbmp.CropTransparentSidesAndBottom(0, true); nbmp.ReplaceTransparentWith(Color.Black); } } int index = 0; while (index < list.Count) { ImageSplitterItem item = list[index]; if (item.NikseBitmap == null) { matches.Add(new CompareMatch(item.SpecialCharacter, false, 0, null)); } else { CompareMatch match = GetNOcrCompareMatch(item, nbmpInput, p); if (match == null) { p.Result = string.Empty; return; } else // found image match { matches.Add(new CompareMatch(match.Text, match.Italic, 0, null)); if (match.ExpandCount > 0) index += match.ExpandCount - 1; } } index++; } p.Result = GetStringWithItalicTags(matches); }
private string OcrViaNOCR(Bitmap bitmap, int listViewIndex) { if (_ocrFixEngine == null) comboBoxDictionaries_SelectedIndexChanged(null, null); string line = string.Empty; if (_nocrThreadResults != null) line = _nocrThreadResults[listViewIndex]; if (string.IsNullOrEmpty(line)) { var nbmpInput = new NikseBitmap(bitmap); nbmpInput.ReplaceNonWhiteWithTransparent(); var matches = new List<CompareMatch>(); List<ImageSplitterItem> list = NikseBitmapImageSplitter.SplitBitmapToLetters(nbmpInput, (int)numericUpDownNumberOfPixelsIsSpaceNOCR.Value, checkBoxRightToLeft.Checked, Configuration.Settings.VobSubOcr.TopToBottom); foreach (ImageSplitterItem item in list) { if (item.NikseBitmap != null) { item.NikseBitmap.ReplaceNonWhiteWithTransparent(); item.Y += item.NikseBitmap.CropTopTransparent(0); item.NikseBitmap.CropTransparentSidesAndBottom(0, true); item.NikseBitmap.ReplaceTransparentWith(Color.Black); } } int index = 0; bool expandSelection = false; bool shrinkSelection = false; var expandSelectionList = new List<ImageSplitterItem>(); while (index < list.Count) { ImageSplitterItem item = list[index]; if (expandSelection || shrinkSelection) { expandSelection = false; if (shrinkSelection && index > 0) { shrinkSelection = false; } else if (index + 1 < list.Count && list[index + 1].NikseBitmap != null) // only allow expand to EndOfLine or space { index++; expandSelectionList.Add(list[index]); } item = GetExpandedSelection(nbmpInput, expandSelectionList, checkBoxRightToLeft.Checked); if (item.NikseBitmap != null) { item.NikseBitmap.ReplaceNonWhiteWithTransparent(); item.Y += item.NikseBitmap.CropTopTransparent(0); item.NikseBitmap.CropTransparentSidesAndBottom(0, true); item.NikseBitmap.ReplaceTransparentWith(Color.Black); } _vobSubOcrNOcrCharacter.Initialize(bitmap, item, _manualOcrDialogPosition, _italicCheckedLast, expandSelectionList.Count > 1, null, _lastAdditions, this); DialogResult result = _vobSubOcrNOcrCharacter.ShowDialog(this); _manualOcrDialogPosition = _vobSubOcrNOcrCharacter.FormPosition; if (result == DialogResult.OK && _vobSubOcrNOcrCharacter.ShrinkSelection) { shrinkSelection = true; index--; if (expandSelectionList.Count > 0) expandSelectionList.RemoveAt(expandSelectionList.Count - 1); } else if (result == DialogResult.OK && _vobSubOcrNOcrCharacter.ExpandSelection) { expandSelection = true; } else if (result == DialogResult.OK) { var c = _vobSubOcrNOcrCharacter.NOcrChar; if (expandSelectionList.Count > 1) c.ExpandCount = expandSelectionList.Count; _nocrChars.Add(c); SaveNOcrWithCurrentLanguage(); string text = _vobSubOcrNOcrCharacter.NOcrChar.Text; string name = SaveCompareItem(item.NikseBitmap, text, _vobSubOcrNOcrCharacter.IsItalic, expandSelectionList.Count); var addition = new ImageCompareAddition(name, text, item.NikseBitmap, _vobSubOcrNOcrCharacter.IsItalic, listViewIndex); _lastAdditions.Add(addition); matches.Add(new CompareMatch(text, _vobSubOcrNOcrCharacter.IsItalic, expandSelectionList.Count, null)); expandSelectionList = new List<ImageSplitterItem>(); } else if (result == DialogResult.Abort) { _abort = true; } else { matches.Add(new CompareMatch("*", false, 0, null)); } _italicCheckedLast = _vobSubOcrNOcrCharacter.IsItalic; } else if (item.NikseBitmap == null) { matches.Add(new CompareMatch(item.SpecialCharacter, false, 0, null)); } else { CompareMatch match = GetNOcrCompareMatch(item, bitmap, _nocrChars, _unItalicFactor, checkBoxNOcrItalic.Checked, !checkBoxNOcrCorrect.Checked); if (match == null) { _vobSubOcrNOcrCharacter.Initialize(bitmap, item, _manualOcrDialogPosition, _italicCheckedLast, false, null, _lastAdditions, this); DialogResult result = _vobSubOcrNOcrCharacter.ShowDialog(this); _manualOcrDialogPosition = _vobSubOcrNOcrCharacter.FormPosition; if (result == DialogResult.OK && _vobSubOcrNOcrCharacter.ExpandSelection) { expandSelectionList.Add(item); expandSelection = true; } else if (result == DialogResult.OK) { _nocrChars.Add(_vobSubOcrNOcrCharacter.NOcrChar); SaveNOcrWithCurrentLanguage(); string text = _vobSubOcrNOcrCharacter.NOcrChar.Text; string name = SaveCompareItem(item.NikseBitmap, text, _vobSubOcrNOcrCharacter.IsItalic, 0); var addition = new ImageCompareAddition(name, text, item.NikseBitmap, _vobSubOcrNOcrCharacter.IsItalic, listViewIndex); _lastAdditions.Add(addition); matches.Add(new CompareMatch(text, _vobSubOcrNOcrCharacter.IsItalic, 0, null)); } else if (result == DialogResult.Abort) { _abort = true; } else { matches.Add(new CompareMatch("*", false, 0, null)); } _italicCheckedLast = _vobSubOcrNOcrCharacter.IsItalic; } else // found image match { matches.Add(new CompareMatch(match.Text, match.Italic, 0, null)); if (match.ExpandCount > 0) index += match.ExpandCount - 1; } } if (_abort) return string.Empty; if (!expandSelection && !shrinkSelection) index++; if (shrinkSelection && expandSelectionList.Count < 2) { shrinkSelection = false; expandSelectionList = new List<ImageSplitterItem>(); } } line = GetStringWithItalicTags(matches); } line = FixNocrHardcodedStuff(line); //ocr fix engine string textWithOutFixes = line; if (_ocrFixEngine.IsDictionaryLoaded) { if (checkBoxAutoFixCommonErrors.Checked) line = _ocrFixEngine.FixOcrErrors(line, listViewIndex, _lastLine, true, checkBoxGuessUnknownWords.Checked); int correctWords; int wordsNotFound = _ocrFixEngine.CountUnknownWordsViaDictionary(line, out correctWords); if (wordsNotFound > 0 || correctWords == 0 || textWithOutFixes != null && textWithOutFixes.ToString().Replace("~", string.Empty).Trim().Length == 0) { _ocrFixEngine.AutoGuessesUsed.Clear(); _ocrFixEngine.UnknownWordsFound.Clear(); line = _ocrFixEngine.FixUnknownWordsViaGuessOrPrompt(out wordsNotFound, line, listViewIndex, bitmap, checkBoxAutoFixCommonErrors.Checked, checkBoxPromptForUnknownWords.Checked, true, checkBoxGuessUnknownWords.Checked); } if (_ocrFixEngine.Abort) { ButtonStopClick(null, null); _ocrFixEngine.Abort = false; return string.Empty; } // Log used word guesses (via word replace list) foreach (string guess in _ocrFixEngine.AutoGuessesUsed) listBoxLogSuggestions.Items.Add(guess); _ocrFixEngine.AutoGuessesUsed.Clear(); // Log unkown words guess (found via spelling dictionaries) LogUnknownWords(); if (wordsNotFound >= 3) subtitleListView1.SetBackgroundColor(listViewIndex, Color.Red); if (wordsNotFound == 2) subtitleListView1.SetBackgroundColor(listViewIndex, Color.Orange); else if (wordsNotFound == 1) subtitleListView1.SetBackgroundColor(listViewIndex, Color.Yellow); else if (line.Trim().Length == 0) subtitleListView1.SetBackgroundColor(listViewIndex, Color.Orange); else subtitleListView1.SetBackgroundColor(listViewIndex, Color.LightGreen); } if (textWithOutFixes.Trim() != line.Trim()) { _tesseractOcrAutoFixes++; labelFixesMade.Text = string.Format(" - {0}", _tesseractOcrAutoFixes); LogOcrFix(listViewIndex, textWithOutFixes.ToString(), line); } return line; }
static string NocrThreadDoItalicWork(NOcrThreadParameter p) { var unItalicedBmp = UnItalic(p.Picture, p.UnItalicFactor); var nbmp = new NikseBitmap(unItalicedBmp); nbmp.ReplaceNonWhiteWithTransparent(); Bitmap bitmap = nbmp.GetBitmap(); unItalicedBmp.Dispose(); var matches = new List<CompareMatch>(); int minLineHeight = p.NOcrLastLowercaseHeight; if (minLineHeight < 10) minLineHeight = 22; int maxLineHeight = p.NOcrLastUppercaseHeight; if (maxLineHeight < 10) minLineHeight = 80; List<ImageSplitterItem> lines = NikseBitmapImageSplitter.SplitVertical(nbmp, minLineHeight); List<ImageSplitterItem> list = NikseBitmapImageSplitter.SplitBitmapToLetters(lines, p.NumberOfPixelsIsSpace, p.RightToLeft, Configuration.Settings.VobSubOcr.TopToBottom); foreach (ImageSplitterItem item in list) { if (item.NikseBitmap != null) { item.NikseBitmap.ReplaceNonWhiteWithTransparent(); item.Y += item.NikseBitmap.CropTopTransparent(0); item.NikseBitmap.CropTransparentSidesAndBottom(0, true); item.NikseBitmap.ReplaceTransparentWith(Color.Black); } } int index = 0; while (index < list.Count) { ImageSplitterItem item = list[index]; if (item.NikseBitmap == null) { matches.Add(new CompareMatch(item.SpecialCharacter, false, 0, null)); } else { bool old = p.AdvancedItalicDetection; p.AdvancedItalicDetection = false; CompareMatch match = GetNOcrCompareMatch(item, bitmap, p); p.AdvancedItalicDetection = old; if (match == null) { return string.Empty; } else // found image match { matches.Add(new CompareMatch(match.Text, match.Italic, 0, null)); if (match.ExpandCount > 0) index += match.ExpandCount - 1; } } index++; } return "<i>" + Utilities.RemoveHtmlTags(GetStringWithItalicTags(matches)) + "</i>"; }