本文转载自:http://dev.classmethod.jp/smartphone/opencv-manga-2/
OpenCVで写真を漫画風に加工しよう 〜実装編〜
前回のおさらい
前回は漫画カメラで撮影した写真から、以下のように画像処理の工程を計画しました。
-
輪郭
- エッジ検出する
- エッジ検出した画像の色を反転する
- 白い部分を透過する
-
白黒の部分
- 画像を三値化する
- 灰色の部分を透過する
-
スクリーントーンの部分
- スクリーントーン画像を輪郭画像と白黒部分の画像の最背面に配置する
今回は実際に手を動かして、写真を漫画風に加工するサンプルアプリを作成してみましょう。尚、今回は以下のような開発環境で実装を行います。
- Mac OS X 10.8.2
- Xcode 4.5.1
- iOS SDK 6.0
OpenCVを使えるようにする
いきなりですが、今回の画像処理を行うにあたってOpenCVを使用します。OpenCVは画像処理に関してとても実績のあるライブラリです。OpenCVはインテルが開発したオープンソースのC/C++、Java、Python用ライブラリで、iOS以外にもMac
OS Xはもちろん、Linux、Windows、Androidなど様々なプラットフォームで動作します。iOSに関してはむしろ最近標準でサポートされたばかりです。
今回OpenCVを使う理由はエッジ検出を使用するからです。このエッジ検出は他のアルゴリズムと比べると比較的簡単なので、自前で実装してもそんなに苦ではないのですが、そうは言ってもそれなりの行数を記述する必要があります。OpenCVではエッジ検出処理を行う関数が用意されています。また、前回少しだけ紹介したOS
X/iOS標準のフレームワークであるCoreImage.frameworkでもエッジ検出がありますが、iOSアプリでは動作しないようになっています(対応していればCoreImage.frameworkを使用したいところですが)。というわけで、今回はOpenCVにあやかっちゃいましょう。どうしても自前で実装したいという方は画像のグレースケール/ネガティブ/エッジ検出処理で、C言語でのエッジ検出処理の実装方法をわかりやすく解説しているのでそちらを参照してください。
OpenCVのダウンロード
SourceForgeからOpenCVのフレームワークをダウンロードします。ダウンロードするバージョンは2.4.3です。OpenCV
– Browse /opencv-ios/2.4.3 at SourceForge.netを開き、opencv2.framework.zipをクリックします。ダウンロードしたら、ZIPファイルを解凍しておいてください。
Xcodeプロジェクトの作成
Xcodeプロジェクトを作成します。テンプレートはSingle View Applicationを選択します。プロジェクトの情報に以下のように入力して任意の場所に保存してください。尚、今回はサンプルですので、保存するときにSource
ControlのCreate local git repository for this projectのチェックは外しておいてください。
項目 | 設定値 |
---|---|
Product Name | MangaFilterTest |
Organization Name | 任意 |
Company Identifier | 任意 |
Class Prefix | なし |
Devices | iPhone |
Use Storyboards | チェックする |
Use Automatic Reference Counting | チェックする |
Include Unit Tests | チェックしない |
opencv2.frameworkの導入
作成したXcodeプロジェクトにopencv2.frameworkを追加
Xcodeプロジェクトを作成したら、ファイルツリービューのFrameworksを右クリックしてAdd Files to “MangaFilterTest”…をクリックします。ファイル選択画面が表示されるので、先ほどダウンロード・解凍して先ほどダウンロード・解凍したopencv2.frameworkを選択し、Copy
items into destination group’s folder (if needed)にチェック、Create groups for any added foldersを選択し、Addボタンをクリックしてプロジェクトに追加します。
Xcodeプロジェクトの設定
ファイルツリービューのプロジェクトを選択し、PROJECTの下にあるMangaFilterTestを選択します。Build Settingsタブをクリックします。表示される設定画面の項目を以下のように変更してください。
項目 | 設定値 |
---|---|
C++ Language Dialect | Compiler Default |
C++ Standard Library | Compiler Default |
これで、XcodeプロジェクトでOpenCVを使用する準備が整いました。
注意:OpenCV 2.4.2を使用する場合
OpenCV 2.4.2はiOS6(armv7s)に対応していないため、使用する際は注意が必要です。 どうしてもOpenCV 2.4.2を使用したい場合は、以下のサイトで導入方法をわかりやすく解説していますので、ぜひ参考にしてください。 iOSでOpenCVを使えるようにしてみる
– FuturesVision
必要なファイルを作成しよう
早速実装作業に入っていきましょう。漫画風のフィルタ処理を実現するため、以下のような工程で画像処理を行います。
上記のように、今回は元画像から輪郭画像と白黒部分の画像をそれぞれ生成し最後に合成するようにします。これらの処理を実現するために、以下のようなクラスを作成します。
クラス | 親クラス | ファイル | 説明 |
---|---|---|---|
FilterBase | NSObject | FilterBase.h FilterBase.mm |
フィルタクラスの抽象クラスです。CGImageとOpenCV画像データ間の変換処理を実装します。 |
LineFilter | FilterBase | LineFilter.h LineFilter.mm |
輪郭を黒いペンでなぞったような画像を生成します。 |
MonochromeFilter | FilterBase | MonochromeFilter.h MonochromeFilter.mm |
白黒部分の画像を生成します。 |
上記ファイルを作成しましょう。ファイルを作成したら、実装ファイルの拡張子を.mから.mmに変更します。実装ファイルの拡張子を.mmにすると、ファイル中にObjective-CとC++のソースコードを混在させることができます。
FilterBaseクラス
FilterBaseクラスはフィルタクラスの抽象クラスです。CGImageからOpenCV画像データに変換したり、OpenCV画像データからCGImageに変換したりするメソッドを定義しておきます。また、このクラスを継承したサブクラスにてフィルタ処理をかけるときに使用するメソッド-
doFilter:も定義しておきます。
FilterBase.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#import #import @interface /*! @method @abstract @discussion @param @return */ - /*! @method @abstract @param
|