使用 IRONOCR

如何在 C# 中進行字幕光學字符識別(教程)

里根普恩
里根普恩
2023年2月21日
已更新 2023年12月17日
分享:

在本教程中,我們將學習如何從視頻文件中提取硬編碼字幕。 我們將取樣一個視頻文件,並將內嵌字幕提取到一個 txt 文件中。我們將開發一個 C# .NET 程式,使用 OCR 過程提取內嵌字幕。 我將使本教程保持簡單易懂,即使是初學者的 C# 程式設計師也能理解。

我們需要一個高效能的光學字符辨識 (OCR) 引擎,不論字幕語言為何,都能處理影片並取得字幕檔案。

有許多提供 OCR 結果的庫可用。 其中有些是付費的,有些難以使用,而有些則效率不高或不準確,因此很難找到一個免費、高效、易於使用且能提供準確結果的庫。

IronOCR 在開發時免費,並為商業用途提供一個月的免費試用。 它支持超過 150 種語言,並且提供比大多數其他可用的 OCR 函式庫更高的準確性。 它既高效又易於使用。 我們將使用此庫進行示範。

IronOCR

IronOCR 是由 Iron Software 開發和維護的一個庫,幫助 C# 軟體工程師在 .NET 項目中執行 OCR、條形碼掃描和文字提取。

IronOCR 的特點包括:

  • 從多種格式中讀取文字,例如圖像(JPEG、PNG、BMP)、GIFTIF/TIFF、流,以及PDF
  • 使用大量濾鏡來校正低品質的掃描和照片,如去斜、降噪、二值化、增強解析度、膨脹等。
  • 讀取超過 20 種不同格式的條碼,以及支援 QR 碼
  • 利用最新版本的 Tesseract OCR,其性能調整超越同類型的其他庫
  • 導出可搜索的PDF、hOCR/HTML導出和圖像內容文本。

    讓我們開發一個讀取車牌號碼的演示應用程式。

創建一個 Visual Studio 專案

第一步是建立一個新專案。

打開 Visual Studio。 點擊建立新專案,然後選擇控制台應用專案模板。

按一下下一步按鈕,為專案命名(我命名為「OCR Subtitles」,您可以根據自己的選擇命名)。

點擊下一步按鈕,並選擇您的目標框架。 最後,點擊建立按鈕來建立專案。

該專案將按如下所示創建。

如何在 C# 中進行字幕 OCR (教程),圖 1:在 Visual Studio 中創建新專案

在 Visual Studio 中創建新專案

現在,我們需要安裝IronOCR庫以在我們的專案中使用它。 最簡單的方法是通過 NuGet 封裝管理器為解決方案安裝它。

安裝 IronOCR NuGet 套件

在頂部選單列中點擊工具,然後選擇NuGet 套件管理器 > 管理方案的 NuGet 套件,如下所示。

如何在 C# 中 OCR 字幕(教程),圖 2:在 Visual Studio 中安裝 IronOCR

在 Visual Studio 中安裝 IronOCR

以下視窗將會出現。

如何在 C# 中對字幕進行 OCR(教程),圖 3:Visual Studio NuGet 套件管理器 UI

Visual Studio NuGet 套件管理器介面

點擊瀏覽,然後搜尋IronOCR。 選擇 IronOCR 套件,然後點擊下面所示的安裝按鈕。

如何在 C# 中進行字幕 OCR(教程),圖4:在 NuGet 套件管理器 UI 中搜尋 IronOCR

在 NuGet 套件管理器 UI 中搜尋 IronOCR

IronOCR 庫將會安裝完成並可使用。

提取硬编码字幕

讓我們編寫一個程式來提取硬編碼字幕。

我們將使用以下螢幕截圖來提取字幕。

如何在C#中OCR字幕(教程),圖5:將從中提取文本的範例視頻截圖

從視頻截圖提取文本的示例

添加以下命名空間:

using IronOcr;
using IronOcr;
Imports IronOcr
$vbLabelText   $csharpLabel

在命名空間宣告下面寫以下代碼。

var ocr = new IronTesseract();
using (var input = new OcrInput(@"D:\Liscence Plate\plate3.jpg"))
{
    var result = ocr.Read(input);
    Console.WriteLine(result.Text);
}
var ocr = new IronTesseract();
using (var input = new OcrInput(@"D:\Liscence Plate\plate3.jpg"))
{
    var result = ocr.Read(input);
    Console.WriteLine(result.Text);
}
Dim ocr = New IronTesseract()
Using input = New OcrInput("D:\Liscence Plate\plate3.jpg")
	Dim result = ocr.Read(input)
	Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

上述程式碼的運作如下:

  1. 初始化IronTesseract對象。 它將創建一個IronTessearct的默認實例。

  2. 建立一個新的OcrInput物件,填入輸入圖像檔或 PDF 文件。 OcrInput 是首選的輸入類型,因為它允許對多頁文檔進行 OCR,並且允許在 OCR 前增強圖像,以獲得更快、更準確的結果。

  3. 從 OCR 輸入物件中讀取文本並返回 OCR 結果物件。 ocr.Read 將從給定的輸入截圖中提取字幕。

  4. result.Text 將返回從給定輸入中提取的整個內容。

    範例程序生成以下控制台輸出:

    如何在 C# 中進行字幕 OCR(教程),圖 7:使用 IronOCR 對範例圖像執行文字擷取後生成的控制台輸出

    使用 IronOCR 對範例影像進行文字提取後生成的控制台輸出

    假設您有一個視頻幀,其中包含視頻的標題和字幕:

    如何在 C# 中進行字幕 OCR(教程),圖6:較長影片的單一畫面,其中包含影片標題和影片字幕的文字區域

    包含影片標題和字幕文字區域的長影片單格影像

    我們的目標是從影像的底部區域中提取硬編碼的字幕。 在這種情況下,我們需要指定顯示字幕的文字區域。

指定字幕在框架中的位置

我們可以使用System.Drawing.Rectangle指定一個區域,在該區域中我們將從影片幀中讀取字幕。 度量單位一律是像素

我們將使用以下範例代碼來指定文本區域。

var ocr = new IronTesseract();
using (var input = new OcrInput())
{
    // a 41% improvement on speed
    var contentArea = new CropRectangle(x: 189, y: 272, height: 252, width: 77);
    input.AddImage(@"D:\subtitle\image.png", contentArea);
    var result = ocr.Read(input);
    Console.WriteLine(result.Text);
}
var ocr = new IronTesseract();
using (var input = new OcrInput())
{
    // a 41% improvement on speed
    var contentArea = new CropRectangle(x: 189, y: 272, height: 252, width: 77);
    input.AddImage(@"D:\subtitle\image.png", contentArea);
    var result = ocr.Read(input);
    Console.WriteLine(result.Text);
}
Dim ocr = New IronTesseract()
Using input = New OcrInput()
	' a 41% improvement on speed
	Dim contentArea = New CropRectangle(x:= 189, y:= 272, height:= 252, width:= 77)
	input.AddImage("D:\subtitle\image.png", contentArea)
	Dim result = ocr.Read(input)
	Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

這帶來了41%的速度提升 - 並允許我們做到具體化。 在contentArea中,我們已經指定了在 x 和 y 的起始點,然後是所需字幕區域的高度和寬度。

將字幕保存到字幕文字檔

讓我們將提取的字幕保存到TXT檔案中。

var ocr = new IronTesseract();
using (var input = new OcrInput(@"D:\subtitle\subtitle1.png"))
{
    var result = ocr.Read(input);
    result.SaveAsTextFile(@"D:\subtitle\subtitlefile.txt");
}
var ocr = new IronTesseract();
using (var input = new OcrInput(@"D:\subtitle\subtitle1.png"))
{
    var result = ocr.Read(input);
    result.SaveAsTextFile(@"D:\subtitle\subtitlefile.txt");
}
Dim ocr = New IronTesseract()
Using input = New OcrInput("D:\subtitle\subtitle1.png")
	Dim result = ocr.Read(input)
	result.SaveAsTextFile("D:\subtitle\subtitlefile.txt")
End Using
$vbLabelText   $csharpLabel

result.SaveAsTextFile將輸出路徑作為參數,並將文件保存到指定路徑。

如何在 C# 中對字幕進行 OCR(教程),圖 8:包含影片標題和字幕文本區域的長影片單幀

包含影片標題和字幕文字區域的長影片單格影像

摘要

在本教程中,我們學習了使用 IronOCR 並開發了一個非常簡單的程式來從影片截圖中讀取字幕。 我們還可以指定我們想要提取文本的區域。

IronOCR 提供 OpenCV 用於計算機視覺的功能。 我們已經看到,IronOCR 使我們能夠從模糊或低解析度的圖像中讀取文字。 此函式庫高效且提供準確性。 它支持127種以上的語言,並具有完全的準確性。 開發過程中免費使用,且在生產上沒有限制。

總結來說,IronOCR 提供:

里根普恩
軟體工程師
Regan 畢業於雷丁大學,擁有電子工程學士學位。在加入 Iron Software 之前,他的工作角色讓他專注於單一任務;而他在 Iron Software 工作中最喜歡的是他所能承擔的工作範圍,無論是增加銷售價值、技術支持、產品開發或市場營銷。他喜歡了解開發人員如何使用 Iron Software 庫,並利用這些知識不斷改進文檔和開發產品。
< 上一頁
如何在C#中從截圖中獲取文字OCR