现在的位置: 首页 > 综合 > 正文

openCV实现卡通画的效果

2014年01月04日 ⁄ 综合 ⁄ 共 3306字 ⁄ 字号 评论关闭

本文转载自:http://dev.classmethod.jp/smartphone/opencv-manga-2/

OpenCVで写真を漫画風に加工しよう 〜実装編〜

前回のおさらい

前回は漫画カメラで撮影した写真から、以下のように画像処理の工程を計画しました。

  1. 輪郭

    1. エッジ検出する
    2. エッジ検出した画像の色を反転する
    3. 白い部分を透過する
  2. 白黒の部分

    1. 画像を三値化する
    2. 灰色の部分を透過する
  3. スクリーントーンの部分

    1. スクリーントーン画像を輪郭画像と白黒部分の画像の最背面に配置する

今回は実際に手を動かして、写真を漫画風に加工するサンプルアプリを作成してみましょう。尚、今回は以下のような開発環境で実装を行います。

  • 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ファイルを解凍しておいてください。

opencv2.frameworkのダウンロード

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ボタンをクリックしてプロジェクトに追加します。

opencv2.frameworkのインポート

Xcodeプロジェクトの設定

ファイルツリービューのプロジェクトを選択し、PROJECTの下にあるMangaFilterTestを選択します。Build Settingsタブをクリックします。表示される設定画面の項目を以下のように変更してください。

項目 設定値
C++ Language Dialect Compiler Default
C++ Standard Library Compiler Default

Xcodeプロジェクトの設定

これで、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
<Foundation/Foundation.h>
#import
<opencv2/opencv.hpp>
 
@interface
FilterBase : NSObject
 
/*!
 @method
 @abstract
フィルタ処理を実行するメソッド
 @discussion
引数imageにフィルタ処理したCGImageを返す。
 @param
image CGImageRef フィルタ処理をかけるCGImage
 @return
CGImageRef フィルタ処理したCGImage
 */
-
(CGImageRef)doFilter:(CGImageRef)image;
 
/*!
 @method
 @abstract
CGImageをOpenCV画像データに変換するメソッド
 @param
image CGImageRef CGImage

抱歉!评论已关闭.