---
# System prepended metadata

title: OCR技術分享 - 以Google Vision為例

---


# OCR技術分享 - 以Google Vision 為例

## 簡介及費用

### 目前常見OCR方案比較
| OCR 服務           | 技術特點                                                              | 中文支持        | 成本                    | 適用場景                          |
|--------------------|-----------------------------------------------------------------------|-----------------|-------------------------|-----------------------------------|
| **Google OCR (Cloud Vision API)** | 多語言支持（100+），包括繁簡體中文，具高精準度；支援印刷體、手寫文字識別，並可結合 NLP 進行進階分析 | 支持良好         | 前 1,000 次免費，之後每 1,000 次約 $1.50 | 電子商務、教育、醫療等高精度文件處理 |
| **百度 OCR**       | 對中文識別進行優化，特別是繁簡體中文印刷體，支援手寫識別；結合行業字典，如財務票據、身份證等高精度識別 | 中文識別出色     | 免費試用 500 次，標準版每 1,000 次約 ¥0.8；專業版每 1,000 次約 ¥1.5 | 適合中文場景應用，如財務發票、身份識別、合同管理 |
| **Tesseract OCR (地端)[演示]** | 免費開源，支援多語言（可通過語言訓練增強中文），適合印刷體；不支持雲端，需要開發者自行配置 | 支持基本，精度一般 | 免費開源，但配置及後續維護成本 | 開源社群使用、個人項目、本地開發測試 |


---
### 為什麼選擇Google?
- 依上述的比較表評估- [Try It](https://cloud.google.com/vision/docs/drag-and-drop?hl=zh-tw)


### Google OCR申請方式及費用

- [如何申請並取得API KEY](https://cloud.google.com/vision/docs/ocr?hl=zh-tw)
- 代碼示例


```C#=
        public async Task<BatchAnnotateImagesResponse> ProcessImageAsync(string imageFilePath)
        {
            LogInfo<object> logInfo = new LogInfo<object>("IMEIRecognitionService.ProcessImageAsync");
            Random random = new Random();
            string apiKey = GOOGLE_KEYS[random.Next(0, 2)];
            string uri = $"{GOOGLE_API_URL}?key={apiKey}";
            byte[] imageBytes = File.ReadAllBytes(imageFilePath);
            string base64Image = Convert.ToBase64String(imageBytes);
            string jsonRequest = $"{{\"requests\": [{{\"image\": {{\"content\": \"{base64Image}\"}}, \"features\": [{{\"type\": \"TEXT_DETECTION\"}}]}}]}}";

            var client = new RestClient(uri);
            var request = new RestRequest(Method.POST);
            request.AddJsonBody(jsonRequest);

            try
            {
                var response = await client.ExecuteAsync(request);
                logInfo.Data = response;
                if (response.IsSuccessful)
                {
                    var datePath = DateTime.Now.ToString("yyyyMMdd");
                    var directoryPath = Path.Combine(Common.FILE_UPLOAD_PATH, datePath);
                    string responseContent = response.Content;
                    string jsonFilePath = Path.Combine(directoryPath, $"{Path.GetFileNameWithoutExtension(imageFilePath)}.json");
                    File.WriteAllText(jsonFilePath, responseContent);
                    LogRepository.Instance.Trace(responseContent, LogType.INFO);
                    return JsonConvert.DeserializeObject<BatchAnnotateImagesResponse>(responseContent);
                }
                else
                {
                    LogRepository.Instance.Trace(logInfo, LogType.WARM);
                }
            }
            catch (Exception ex)
            {
                logInfo.Data = ex;
                LogRepository.Instance.Trace(logInfo, LogType.ERROR);
            }

            return null;
        }
```

## Google OCR使用方式及技巧

## 了解Google OCR回傳JSON檔的資訊結構

Google OCR 回傳的 JSON 檔中包含了豐富的資訊，涵蓋了文字內容、文字的位置信息、語言識別等。以下是 JSON 中一些常見的欄位及其描述：

### 1. `textAnnotations` *
   - **內容**：包含每個檢測到的文字段（包括單詞或整句文字）。
   - **主要欄位**：
     - **description**：識別到的文字內容。
     - **boundingPoly**：文字的邊界框座標，用於定位文字在圖像中的位置。包含四個點的坐標（左上、右上、右下、左下），可表示文字區域的矩形範圍。
     - **locale**：文字的語言代碼（如 "en" 表示英文，"zh" 表示中文），如果能夠識別語言則會顯示。

### 2. `fullTextAnnotation` *
   - **內容**：包含整個圖像的全文內容，特別適用於多行或多段文字的文件。
   - **主要欄位**：
     - **text**：整幅圖像的完整文本內容。
     - **pages**：如果文檔包含多頁，這裡會包含多頁內容，進一步細分為段落、詞彙和符號。
     - **blocks, paragraphs, words, symbols**：提供更細緻的文檔結構。`blocks` 表示文字塊，`paragraphs` 表示段落，`words` 表示詞彙，`symbols` 表示單個字符。每個級別都包含 `boundingBox` 和 `text` 信息。

### 3. `boundingPoly`
   - **內容**：每段文字或單詞的四個邊框點座標（x, y），通常位於 `textAnnotations` 和 `fullTextAnnotation` 的子欄位中。
   - **用途**：用於確定文字在圖像上的精確位置，方便進一步處理，如高亮顯示文字或文本定位。

### 4. `confidence`
   - **內容**：OCR 識別準確度的分數（0.0 到 1.0 之間），數字越高表示識別的準確性越高。
   - **用途**：用來評估文字識別的可靠性，通常在 `fullTextAnnotation` 的細分結構中（如段落、詞彙等級別）包含此欄位。

### 5. `locale`（語言代碼）
   - **內容**：識別出的文字的語言代碼（例如，"en" 代表英文，"zh" 代表中文）。
   - **用途**：方便處理多語言文件，可以根據語言代碼進行分類或翻譯處理。

### 6. `breakType`（換行標記）
   - **內容**：標記行結束、段落結束或其他分隔符，通常在 `fullTextAnnotation` 的 `words` 或 `symbols` 級別中。
   - **用途**：適合處理段落分隔或分行的需求，如在多段文字識別中重建段落結構。

### 7. `property`
   - **內容**：存儲附加屬性信息，例如檢測到的語言、符號屬性等。
   - **主要欄位**：
     - **detectedLanguages**：如果一段文字包含多語言，這裡會列出檢測到的語言代碼。
     - **detectedBreak**：指示當前文字或符號後是否有分隔符（如空格、換行符等）。

---

### JSON 結構範例

以下是一個簡單的 JSON 結構範例，展示上述欄位在 Google OCR 回傳結果中的位置：

```json
{
  "textAnnotations": [
    {
      "description": "Hello, World!",
      "boundingPoly": {
        "vertices": [
          {"x": 10, "y": 20},
          {"x": 100, "y": 20},
          {"x": 100, "y": 60},
          {"x": 10, "y": 60}
        ]
      },
      "locale": "en"
    }
  ],
  "fullTextAnnotation": {
    "text": "Hello, World!",
    "pages": [
      {
        "blocks": [
          {
            "paragraphs": [
              {
                "words": [
                  {
                    "symbols": [
                      {
                        "text": "H",
                        "confidence": 0.98,
                        "property": {
                          "detectedLanguages": [{"languageCode": "en"}]
                        }
                      }
                      // 其他字符信息...
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
}
```



## 擷取OCR本文的一些技巧
  - 使用正規表示式進行篩選
  - 自建訓練（例如直接抓取統編的公司名稱或銀行代碼的銀行名稱）
    - 增加交互比對提高辨識的可信度
  - 暴力辨識與模糊比對



## 未來擴展的一些方向

### 與NLP結合進行自動化內容分類與標籤
  - 如自動識別身份證、財力證明等文件，並為檔案進行分類、標簽

### 實體識別與關聯分析
  - 在處理身份證明、合同或票據等文件時，OCR 可以提取文本，而 NLP 則可進一步識別人名、地名、日期等關鍵實體，並進行關聯分析。例如，在合同中識別公司名稱、簽署人及日期，可以進行匹配和驗證，甚至與其他數據庫交叉比對，以驗證信息的準確性。

