24
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

iPhoneアプリでOpenCV(CocoaPodsを使用しないVer)

はじめに

研究で画像処理を使う機会が多く,iOSでも何かしらの画像処理をしたかったためSwiftでOpenCVを使う方法を調べたのでそのメモ.

必要なもの

・Xcode
・OpneCVフレームワーク(以下のリンクから任意のバージョンをDL)
OpenCV公式サイト
・オススメは3.x系
画像処理に対する熱意

実装方法

1.フレームワークをぶち込む

先ほどダウンロードしたフレームワークを,OpneCVを使いたいプロジェクトフォルダに投げる.

image01.png

次に,「Copy items if needed」にチェックを入れる.

image02.png

2.コードを書くファイルを作成する

OpenCVを書くためのファイルを作成する.
「⌘ + N」または「File」→「New」→「File...」で以下のような画面が出現する.
そして「Cocoa Touch Class」を選択して「Next」

image03.png

クラス名は何でもいいが, Subclassは「NSObject」,Languageは「Objective-C」を選択して「Next」

image04.png

ファイルを任意の場所へ「Create」したら,以下のメッセージが出るので「Creat
e Bridging Header」を選択してObjective-Cのブリッジヘッダーを作成する(bridging headerについての細かい説明は省略)

image05.png

以下のようにファイルが3つ作成される.

image06.png

「opencvTest-Bridging-Header.h」を選択して「opnecvWrapper.h」をインポート.

image07.png

こんな感じ.

3.拡張子を変更

Objective-CとC++を使うので「opencvWrapper.m」を「opencvWrapper.mm」へ変更.

image08.png

image09.png

4.ヘッダーファイルをインポート

OpenCVのヘッダーファイルを「opnecvWrapper.mm」に追加
image10.png

以上でOpenCVを使う準備は完了

5.試しに何かやってみる

では,早速何かしらの画像処理をやってみる.
今回はサクッと画像のグレースケール化.
グレースケール化程度ならSwiftのみでも可能だが今回は動作確認のためにやってみる.
画像は例にならってレナさん.
lena.jpg

6.storyboardを編集

UIImageViewを配置してレナさんを表示,Buttonを配置する.
関連付けを忘れないように
image11.png

7.コードを書いていく

まずは「opnecvWrapper.h」から

opencvWrapper.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface opencvWrapper : NSObject
//(返り値の型 *)関数名:(引数の型 *)引数名;
- (UIImage *)toGray:(UIImage *)input_img;

@end

#import < UIKit/UIKit.h >を忘れずに!!

次に「opencvWrapper.mm」の編集

opencvWrapper.mm
#import <opencv2/opencv.hpp>
//-------------------------------これも忘れずに書く
#import <opencv2/imgcodecs/ios.h> //---①
//-------------------------------
#import "opencvWrapper.h"

@implementation opencvWrapper

-(UIImage *)toGray:(UIImage *)input_img {
    // 変換用Matの宣言
    cv::Mat gray_img;
    // input_imageをcv::Mat型へ変換
    UIImageToMat(input_img, gray_img); //---②

    cv::cvtColor(gray_img, gray_img, CV_BGR2GRAY); //---③

    input_img = MatToUIImage(gray_img); //---④

    return input_img; //---⑤
}

@end

① これがないとUIImageToMatとかが使えない
② 引数のinput_imgをcv::Mat型のgray_imgへ変換
③ gray_imgをRGB画像からグレースケール画像へ変換
④ cv::Mat型からUIImage型へ変換し,input_imgへ入れる
⑤ ViewController.swiftへ返す

最後に「ViewController.swift」の編集

ViewController.swift
import UIKit

class ViewController: UIViewController {

    //--------------------------OpenCVファイルのインポート
    let openCV = opencvWrapper()
    //--------------------------

    // レナ嬢を表示するUIImageView
    @IBOutlet var image : UIImageView!

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

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // グレースケール化ボタン
    @IBAction func toGray() {
        // UIImageViewに表示するUIImage
        let gray_img : UIImage!
        // gray_imgにグレースケール化したimageを入れる
        gray_img  = openCV.toGray(image.image) //---①
        // imageにgray_imageを表示
        image.image = gray_img //---②
    }
}

① openWrapperのtoGray関数へUIImageに表示されている画像を渡し,返ってきた画像をgray_imgに入れる
② 返ってきたgray_imgをUIImageViewへ表示

8.完成図

togray.gif

OpenCVで画像処理を行うことが確認できた.
以上.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
24
Help us understand the problem. What are the problem?