【UiPath】特定領域のキャプチャを取得する方法

# はじめに

- 本記事では、特定領域のキャプチャを取得する方法を紹介します。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 画像データのデジタル化にはDU（Document Understanding）の機能をもちいています。インストールしたパッケージ：UiPath.IntelligentOCR.Activities: 6.19.3
- 製品仕様や参考画像は 24.10 バージョンのもので構成しています。

# 実装サンプル

本日は、次の様な単純なひらがな9文字の画像データをもちいて説明します。

![特定領域をキャプチャ5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/b5428425-165a-70e8-bda3-e873ea1a0d54.jpeg)

まず、座標を求めるための変数と引数の登録および変数の初期化をおこないます。

![特定領域をキャプチャ6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/bfb17031-a852-7ea2-41c7-300fc3aa3092.jpeg)

次にサンプル画像データをデジタル化します。

![特定領域をキャプチャ7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/77832430-d561-2f72-73ed-a3405375ec76.jpeg)

***任意の領域をキャプチャするには、キャプチャしたい領域の座標情報が必要な訳ですが、
上の図の出力にある『ドキュメント オブジェクト モデル（通称：DOM）』がOCRで読み取った文字の座標情報を持っています。***

このDOMは比較的複雑な構造のオブジェクトのため、次の様にして文字と座標情報を取得します。

![特定領域をキャプチャ8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/25c6b2fe-a094-03d3-3233-6b4ebc0a2223.jpeg)

![特定領域をキャプチャ9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/be0a8857-163b-9afa-11d4-cb1720a43387.jpeg)

DOM.Pages(0).Sections の繰り返し
→　currentPageSection.WordGroups の繰り返し
　→　currentWordGroup.Words の繰り返し

```
# 参考：WordGroups の中身

       WordGroups=WordGroup[9] 
      {
        WordGroup 
        {
          IndexInText=0,
          Length=1,
          Type=TableCell,
          Words=Word[1] 
          {
            Word 
            {
              Box=T:50,L:70,W:48,H:78,
              IndexInText=0,
              OcrConfidence=0.98999995,
              Polygon=(70.00,
              51.00),
              (117.00,
              50.00),
              (118.00,
              127.00),
              (72.00,
              128.00),
              Text="あ",
              TextType=Unknown,
              VisualLineNumber=0 
            }
          }
        },
        WordGroup 
        {
          IndexInText=4,
          Length=1,
          Type=TableCell,
          Words=Word[1] 
          {
            Word 
            {
              Box=T:57,L:294,W:44,H:69,
              IndexInText=4,
              OcrConfidence=0.98999995,
              Polygon=(294.00,
              63.00),
              (325.00,
              57.00),
              (338.00,
              122.00),
              (306.00,
              126.00),
              Text="い",
              TextType=Unknown,
              VisualLineNumber=0 
            }
          }
        },
・・・省略
```

（始点情報の取得、設定）
![特定領域をキャプチャ10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/9b34d60e-4ffc-e4c7-e826-24cfe3599ca7.jpeg)
![特定領域をキャプチャ11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/b678f123-3a34-b67c-00ec-cf54bccc39e3.jpeg)

Polygon の最初のデータが領域の左上の座標なので、座標データ未取得（始点X座標 = 0 and 始点Y座標 = 0）の際に「.X」「.Y」プロパティで値を設定します。

（終点情報の取得、設定）
![特定領域をキャプチャ12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/0f40a8ca-ba64-4735-db84-aae6c3fe7224.jpeg)
![特定領域をキャプチャ13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/d70bfbce-5712-a921-2dbf-be12feb3cfa6.jpeg)
![特定領域をキャプチャ14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/135a9762-0a94-f064-5e7e-89a425a571d9.jpeg)

Polygon の3番目のデータが領域の右下の座標なので、カウンタを用意し3番目のデータ（カウンタは0からはじまるため値が「2」）の際に「.X」「.Y」プロパティで値を設定します。

::: note
座標情報を設定する際、気持ちピクセルを足しておきます。（上図の例ではX座標に20ピクセル足しています）
これは***OCRの文字認識範囲が見た目より内側になる***ためです。
:::

最後に画像データのトリミングと保存↓↓

![特定領域をキャプチャ16.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/78a22f3d-48ce-1968-a889-3b59b6c902bc.jpeg)

（例）代入の右辺
画像データ.SimpleCrop(New UiPath.Core.Region(New RectAngle(Cint(始点X座標),CInt(始点Y座標),CInt(終点X座標-始点X座標),CInt(終点Y座標-始点Y座標))))

※本サンプルは終点が始点より右下になる例のみしか考慮していません。
※始点と終点の値が反転するケースは、値比較の条件分岐の追加実装が必要です。

## 処理結果のサンプル

始点文字列：あ
終点文字列：お

（出力ログ）
![特定領域をキャプチャ15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/37429905-4db3-82f9-79a5-07072092f6a4.jpeg)

（トリミング後の画像）
![サンプルキャプチャ_トリミング後_あお.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/7c25794f-574b-2ebd-a646-ec867c1266b3.jpeg)

始点文字列：い
終点文字列：く

（出力ログ）
![特定領域をキャプチャ17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/4e58bec2-cbf3-179a-5278-012ead4f59c3.jpeg)

（トリミング後の画像）
![サンプルキャプチャ_トリミング後_いく.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/0d6104b2-ff76-3404-a85e-c5090cc38b3a.jpeg)

# さいごに
いかがでしたでしょうか。
今回は文字画像でサンプル説明しましたが、特定文字列をアンカーにイラストや表データなどを切り取ることも簡単にできそうですね☀
最後までお読みいただきありがとうございます(・ω・)ノ