よちよちサンデープログラミングトップへ
##はじめに
「ナンプレ自動解答」(iOS版)は、ナンプレ(数独)の問題を写真に撮ると、その問題を自動的に解き、答えを示すアプリです。
そのため、例えばナンプレの懸賞本の大量の問題を解く時間を短縮したり、解答が載っていない問題の答えを確認したり、あるいは自作した問題が正しく答えを導き出せるものであるかどうかを確認したりするのに使えます。
本記事では、ナンプレ自動解答で実装している各機能をTipsとして解説します。
##開発・実行環境
ナンプレ自動解答は、以下の環境で開発・実行しています。
- 開発環境 : macOS、Xcode(9~10)、Swift(4~5)
- 実行環境 : iOS 11以上
##アプリの構成の概要
ナンプレ自動解答は、2つの画面を持ちます。1つは、ナンプレの問題(9x9のマス目や各マスの数字)を表示し、数字を編集するため操作を受け付ける独自ビューと、機能を呼び出す複数のボタンと、広告(AdMob)が表示されます。もう1つは、ナンプレの問題を写真に撮るためのAVFoundationを使ったカメラ画面です。
本アプリでは、カメラで撮影した写真から、ナンプレの問題(9x9のマス目)を切り出し、さらにその各マスの数字を認識し、解答処理を行う対象データとして取り込みますが、マス目の切り出しにはOpenCVを使い、数字の認識にはOCRライブラリ(Tesseract OCR iOS)を使っています。解答処理は、オリジナルのヒューリスティックアルゴリズムです。
##実装している機能
本アプリを実現するために、以下の機能を実装しており、それぞれTipsとして解説していきます。
※リンクをクリックするとTips解説記事に飛びます。リンクされていない項目は、記事を鋭意作成中です。
- OpenCVライブラリを組み込む
- 写真から、四角形領域を切り出す(OpenCV)
- OCRライブラリを組み込む(Tesseract OCR iOS)
- OCR機能で文字を認識する(Tesseract OCR iOS)
- 独自ビューに描画する(UIView)
- 独自ダイアログを実装する(UIView)
- 画面レイアウト決定後に、ビューを再描画する(UIView)
- 画像を拡縮する(UIImage)
- StoryBoardで定義した画面(ViewController)をコードから呼び出して開く
- 独自カメラ機能を実装する(AVFoundation)
- 非同期処理(別スレッド処理)をする(DispatchQueue)
- 処理待ちのインジケータ(くるくる)を表示する・消す(UIActivityIndicatorView)
- Webページを外部ブラウザで表示する(UIApplication)
- アプリのバージョン番号を取得する(Bundle)
- デバイスがiPadか否かを判定する(UIDevice)
- ラベルやボタンのフォントサイズをコードで変更する(UILabel、UIButton)