ObjecTips

Swift & Objective-C で iOS とか macOS とか

CITextFeature の iOS 9β4 での変更点

iOS 9で追加されたテキスト領域の矩形を検出できる CITextFeatureiOS 9 β4 で subFeatures というプロパティが追加された。

@property (readonly) NSArray *subFeatures;

この subFeatures プロパティは検出した領域内に含まれる各文字の領域を示す CITextFeature を取得する事ができる。
subFeatures の検出を有効にするには features の検出時に CIDetectorReturnSubFeatures オプションを YES にする必要がある。

    NSArray *features = [detector featuresInImage:image
                                          options:@{CIDetectorReturnSubFeatures: @YES}];


以下のようなコードで画像から features と subFeatures を検出し矩形を取得する事ができる。

まず NSURL から CIImage を取得する。
次に CIAffineTransform フィルタを用いて画像の上下を反転させている。検出されたテキスト領域を示す bounds の値が上下反転したものだったためこの処理を挟んでいる。
そして CIDetector を作成し、最後に CIDetectorReturnSubFeatures オプションを使って CIFeature を取得している。

LogTextFeatures 関数では features と subFeatures を階層化してログ表示するコードを実装している。

このコードを使って以下の画像のテキスト矩形を検出すると

f:id:Koze:20150726020909p:plain

以下のようにログ出力される。
subFeatures はインデント付きで出力される。

{{61, 172}, {202, 45}}
  |-{{61, 172}, {38, 44}}
  |-{{104, 172}, {34, 44}}
  |-{{143, 171}, {38, 46}}
  |-{{188, 172}, {36, 44}}
  |-{{231, 172}, {32, 44}}
{{62, 101}, {159.00000000000003, 44}}
  |-{{62, 111}, {30, 34}}
  |-{{96, 100}, {28, 45}}
  |-{{128, 111}, {27, 34}}
  |-{{158, 100}, {28, 45}}
  |-{{192, 111}, {29, 34}}

これらの値を元に features を赤色で、subFeatures を青色で線を引いてオーバーレイすると以下のようになる。

f:id:Koze:20150726020958p:plain

各行の矩形が features として、各アルファベットの矩形が subFeatures として取得されている事が分かる。


試しに以下の画像を使用してひらがな、カタカナ、漢字を検出してみた。

f:id:Koze:20150726021631p:plain

ログ出力は以下

{{43.109442019177621, 127.0003050117239}, {230.7636540404522, 55.999084964828342}}
  |-{{44, 129}, {45, 50}}
  |-{{105, 128}, {44, 53}}
  |-{{164, 129}, {45, 50}}
  |-{{224, 130}, {49, 49}}

検出結果を元に線をオーバーレイすると以下

f:id:Koze:20150726021759p:plain

残念ながらカタカナしか検出してくれなかった。

検出精度の向上も望まれるが、OCRによる文字認識がサポートされればかなり幅が広がりそう。


iOS 9 β4の時点では Swift + iOS Simulator の際に FKTextDetector not loaded とコンソールに表示され CITextFeature を取得する事が出来ない不具合がある様で、Swift の場合は実機で試す必要がある。
Objective-C の場合は Simulator と実機どちらでもOKだった。