NHocrをWindowsでビルド

win-nhocrをwindowsでビルドしようとしたら3つのエラーが起きたので、その対処(手順)の話
# プラットフォームツールセットエラー
# afxres.h include エラー
# freetype.lib なしエラー


イントロ

iOSOCRを試してみる事にした。
日本語OCRで、オープンソース・簡単に使える系だとこの辺っぽい。

  • tesseract-ocr
  • NHocr


teseract-ocrは、cocoapodsを使ってちょいちょいと試せたのだけど。

NHocrの方は、Macでのbuildもままらない。
ので、まずは、慣れてるWindowsでbuild出来る所まで行く事にした。


Windows(VisualStudio2012)向けのソリューション一式がGitHubにあるので、それをダウンロードする。


matthewn4444/win-nhocr · GitHub


win-nhocr.slnをVisualStudio2012で開いてみて、何も考えずにビルド。


1. プラットフォームツールセットエラー

エラー	1	error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build using the v120 build tools, either click the Project menu or right-click the solution, and then select "Update VC++ Projects...". Install v120 to build using the v120 build tools.	C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Platform.targets	44	5	libimgo

上のようなエラーが何個か出る。


プロジェクトのビルドのプラットフォームツールセットの指定が、環境に無いもの(v120=VisualStudio2013)を指定しているとエラーになっている模様。


ソリューション・プロジェクトを2012に開いても何も言われてない事から2012のモノで間違い無さそうだけど、何故かプラットフォームツールセットの指定が2013のものになっているよう。
環境に2013が入っていると、2012上で操作しててもv120=2013が選べるらしいので、そういう環境で作成されたのかも。


実験してないが、VisualStudio2013が入っている環境であれば上のエラーは出ないじゃないかと思う。

1.の対処

対処としては、ソリューションエクスプローラー上でプロジェクト(nhocr)を右クリック→プロパティ→構成プロパティ→全般→プラットフォームツールセットで、Visual Studio 2012(v110)を選択する。


これを、

  • nhocr
  • libimgo
  • libnhocr
  • libufp
  • objgrp
  • siplib

の各プロジェクトに対して設定する。


そして、ビルド。


2. afxres.h include エラー

エラー	1	error RC1015: cannot open include file 'afxres.h'.	D:\space\Projects\ocr\win-nhocr-master\nhocr\nhocr.rc	10	1	nhocr

次は、こんなエラーが出る。
多分これは、ExpressバージョンのVisual Studioを使って無ければ出ない。


afxres.hが無いと言われてて、これがExpressバージョンには無い模様。
MFCを使って無ければ不要なので、

2.の対処

・includeの記述をafxres.hから代替のwinres.hに変える 参照
・一切使って無さそうなので、コメントアウト
で対処する。


またビルド。


3. freetype.lib なしエラー

エラー	1	error LNK1104: ファイル 'freetype.lib' を開くことができません。	D:\space\Projects\ocr\win-nhocr-master\nhocr\LINK	nhocr


というエラー。
freetypeは、win-nhocrには含まれてないので、別途持ってくる。

3.の対処

freetypeを別途用意して、プロジェクトのライブラリディレクトリに追加する。


ビルド済みのものが、GnuWin32 projectダウンロードページにあるので、ダウンロードする。
参照


BinariesのZipのリンクを選択してダウンロード。
適当な場所に解凍して、プロジェクトにfreetype.libを参照先フォルダ指定を追加する。
ソリューションエクスプローラー上でプロジェクトnhocrを右クリック→プロパティ→構成プロパティ→リンカー→全般→追加のライブラリディレクトリに追加。


例:解凍して出来た freetype-2.3.5-1-bin を freetype にリネームして win-nhocr-master フォルダに配置した場合、
..\freetype\lib


ビルド
これでまだwarningは出るがビルド出来る。



実際にテストの話は次回で。

SwiftでPickerViewを配置して項目の選択を実装する

  1. storyboardでPickerViewをView Controllerに配置する
  2. 配置したViewController class のベースクラスに、UIPickerViewDelegate と UIPickerViewDataSource を追加する
  3. ViewController class にdelegateを実装
  4. storyboardのPickerViewとViewController classを接続する
  5. PickerViewのdelegate・data sourceにViewController class(のインスタンス)を設定する
  • 配置したViewController class のベースクラスに、UIPickerViewDelegate と UIPickerViewDataSource を追加する
class ViewController: UIViewController
{
〜
}

class ViewController: UIViewController,
                             UIPickerViewDelegate,
                             UIPickerViewDataSource
{
〜
}

※この時点でerrorが出る(追加したベースクラスに応じて実装が必要な関数の定義がないため)



  • ViewController class にdelegateを実装
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

※buildに必須


    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return 2
    }

※buildに必須


    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        return "test"
    }

※あった方が良い、後で使う


    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    }

※後で使う



    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.pickerDetectMode.delegate = self
        self.pickerDetectMode.dataSource = self
    }


これで、buildが通り、実行したらstoryboardでPickerViewを置いた位置に1列でtest/testと同じ2行の項目のPickerが表示されればOK。

イザナミ攻略ドロップキャラ中心

イザナミ、1回の降臨で7勝2敗くらいになってきたので、攻略をまとめます。


今は、
クィーンバタフライ(神化)
ぬらりひょん
オルガ(進化)
ナポレオン(進化)(フレンド)
で行く事が多いです。


オルガ→エンシェントリドラ・クィーンバタフライ・ヨルムンガンドとかでも良いと思います。
クィーンバタフライx2、ヨルムンガンドは未実験ですが。オルガ・エンシェントリドラは期間限定なので、持っていない場合、クィーンバタフライx2だと思います。
※一部スクショがエンシェントリドラだったりします
ナポレオン→テキーラはほとんどやってないので分からないのですが、貫通キャラを1か2入れておくのを気をつけておけば良い思います。
貫通キャラはハートを取るのはもちろん、とにかくぬらりひょんの友情コンボが強力なのでそれをどこからでも起爆させ易いのも重要です。

ちなみに順番ですが、クィーンバタフライ→ぬらりひょんはオススメしません。バトル1・2・4の復活ループで、クィバタで削っても、ぬらりひょんが決めきれない場面が多々あって、ものすごく時間がかかってしまう事があるからです。自分は、マルチの関係もって、クィバタ→ナポレオン→オリガorエンシェント→ぬらで行っています。

続きを読む

OpenCV2.4.10でbuild error

■結論

ライブラリ(cocoapods?)のバグっぽいので、前のバージョンを指定して改善されるまで待つ。
podfileを

platform :ios, "8.1"
pod 'openCV', '2.4.9.1'

と書いてバージョン指定。回避。

■経緯

OpenCVで新しい実験をしようとpod installして実験コード書いてみると。謎のビルドエラー。

Undefined symbols for architecture arm64:
  "_jpeg_free_small", referenced from:
      _free_pool in opencv2(jmemmgr.o)
      _self_destruct in opencv2(jmemmgr.o)
  "_jpeg_mem_available", referenced from:
      _realize_virt_arrays in opencv2(jmemmgr.o)
  "_jpeg_free_large", referenced from:
      _free_pool in opencv2(jmemmgr.o)
  "_jpeg_open_backing_store", referenced from:
      _realize_virt_arrays in opencv2(jmemmgr.o)
  "_jpeg_get_large", referenced from:
      _alloc_large in opencv2(jmemmgr.o)
      _alloc_barray in opencv2(jmemmgr.o)
  "_jpeg_mem_term", referenced from:
      _jinit_memory_mgr in opencv2(jmemmgr.o)
      _self_destruct in opencv2(jmemmgr.o)
  "_jpeg_mem_init", referenced from:
      _jinit_memory_mgr in opencv2(jmemmgr.o)
  "_jpeg_get_small", referenced from:
      _jinit_memory_mgr in opencv2(jmemmgr.o)
      _alloc_small in opencv2(jmemmgr.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

実験コードがまずい?何か手順違った?と思って、真っ新なプロジェクトに前の記事で上手く行った手順をもう一度やって、OpenCVだけ入れた状態でビルドしてみるが、同様のエラー。


エラーメッセージで検索してみると。同様のエラーが結構出てるっぽい。2.4.10からっぽい。
OpenCV - Bug #4052/ No iOS Framework for 2.4.10 - OpenCV DevZone


前の記事では、OpenCVの2.4.9.1を入れていた。
(今入ってるライブラリのバージョンは、プロジェクトのpodfile.lockをテキストで開いたら見れた)
入れるライブラリのバージョンを指定してなかったので、最新版が変わって2.4.10が入るようになってビルドエラーとなった模様。
podfileでライブラリのバージョンを指定できるようなので、podfileを書き換えて、もう一度pod install→buildしてみる。

platform :ios, "8.1"
pod 'openCV'

platform :ios, "8.1"
pod 'openCV', '2.4.9.1'

回避成功。

Macに移行してすぐCocoaPodsを使ったらハマったお話

cocoapodsでライブラリを導入しようとPodfileを作成して「pod install」をした所、以下のようなエラーが出た。

$ pod install
/Library/Ruby/Gems/2.0.0/gems/cocoapods-0.35.0/lib/cocoapods/user_interface/error_report.rb:13:in `report': incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)
	from /Library/Ruby/Gems/2.0.0/gems/cocoapods-0.35.0/lib/cocoapods/command.rb:58:in `report_error'
	from /Library/Ruby/Gems/2.0.0/gems/claide-0.7.0/lib/claide/command.rb:300:in `handle_exception'
	from /Library/Ruby/Gems/2.0.0/gems/claide-0.7.0/lib/claide/command.rb:274:in `rescue in run'
	from /Library/Ruby/Gems/2.0.0/gems/claide-0.7.0/lib/claide/command.rb:264:in `run'
	from /Library/Ruby/Gems/2.0.0/gems/cocoapods-0.35.0/lib/cocoapods/command.rb:45:in `run'
	from /Library/Ruby/Gems/2.0.0/gems/cocoapods-0.35.0/bin/pod:43:in `<top (required)>'
	from /usr/bin/pod:23:in `load'
	from /usr/bin/pod:23:in `<main>'

■結論

Podfileの中身の引用符が間違っていた。
Macのテキストエディットのスマート引用符で'が‘や’、"が“や”になっていた。
とりあえず、'を入力して‘とかに自動的に変わったら取り消すをして、スマート引用符で自動変換された所を元に戻して対処した。

■経緯

iOSOpenCVを使うので、
SwiftでOpenCVを使ってみた|画像処理だけで飯が食えるかっ!?
Swift + OpenCVでリアルタイムに顔認識してみた1 - Give it a shot

とかを参考にProjectへの組み込みを進めてみるが、まず、軽く書いてある Podfile(単純なテキストファイル)の作り方が分からない。


Windowsだとエクスプローラーで右クリックメニューでファイル作ってかな。と思ったけど、ファインダーでテキストファイルの作り方が分からない。


しょうがないから、標準のテキストエディターっぽいテキストエディットを開いて、保存する。
これも当初メモ帳どこ?メモ帳どこ?状態だった。command+spaceでSpotlight検索にテキストってうって呼び出した。


Podfileを編集して保存しようとすると、今度は普通のテキスト形式での
保存がない。これは「メニュー→フォーマット→標準テキストにする」で、あらかじめ標準テキストにしておくだった。
保存する時「拡張子が未指定の場合は、“.txt”を使用」のチェックも外しておく。


やっと保存できて、ターミナルで「pod install」すると、上のエラーメッセージになって、エラーメッセージで検索しても意外と情報が無くてハマった。


最初英語なので、読んでなかったココに引用符の間違いが指摘されていたので、ひょっとして、これ見た目が変わってるだけじゃなくて別の文字コードになってる?と思ったら、テキストエディットに「スマート引用符の取り消し」とあり、ナンダコレ?となった。
スマート引用符での自動変換を取り消すようにして、Podfileを修正。

platform :ios, “8.1”
pod ‘openCV’

platform :ios, "8.1"
pod 'openCV'


改めて、「pod install」。

$ pod install
Analyzing dependencies

CocoaPods 0.36.0.beta.1 is available.
To update use: `gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org
and the CHANGELOG for this version http://git.io/BaH8pQ.

Downloading dependencies
Installing OpenCV (2.4.9.1)
Generating Pods project
Integrating client project

[!] From now on use `Test150112.xcworkspace`.

となり、成功!

iPhone実機に転送してみた

カメラを使ってみたかったので、実機転送を試してみた。


転送するプログラムはコチラ。
[Swift]iPhoneのカメラに映ってる画像にカスタムフィルタかけてみる(前編) | Developers.IO

  1. Xcode を立ち上げる
  2. Create new a Xcode project を選択
  3. iOS→Application→Single View Application
  4. Language=Swift
  5. Devices=iPhone
  6. Use Core Dataはチェックしない
  7. Source Controlはチェックする
  8. 適当な保存場所を選択

までやり、ViewController.swiftにリンク先のサンプルコードをコピー。


一点build errorが起きたので修正。

        //背面カメラの検索
        for device: AnyObject in AVCaptureDevice.devices()
        {
            if device.position == AVCaptureDevicePosition.Back
            {
                device = device as AVCaptureDevice
            }
        }
         

        //背面カメラの検索
        for d: AnyObject in AVCaptureDevice.devices()
        {
            if d.position == AVCaptureDevicePosition.Back
            {
                device = d as AVCaptureDevice
            }
        }


転送の手順はコチラを参考にして実施。
iOSで実機にアプリを転送してテストする方法 — braitom's Tech Memo


7. テスト端末の登録 で、Organizerを開いてもDevicesが現れなくてハマった。
Window→Devicesに変わってた。


参考:XCode6 OrganizerにDevicesがない - Qiita


そのため、9. プロビジョニングファイルの作成 で、
XcodeのOrganizerで追加のプロビジョニングファイルStatus=Valid profileになっている事の確認方法が分からなかったので、
Window→Devices→iPhoneコンテキストメニュー→Show Provisioning Profiles... に追加されていればOKとした。


無事、転送できた!