食後のSwift ~琵琶湖からコンバンハ~

swiftやオキュラスについて書こうと思っていたブログ。

【Swift】OpenCVを使ってみる 3 〜カラー画像をグレースケールに変換〜

この記事は、

【Swift】OpenCVを使ってみる 1 〜導入編〜 - 食後のSwift ~琵琶湖からコンバンハ~

【Swift】OpenCVを使ってみる 2 〜バージョンを表示〜 - 食後のSwift ~琵琶湖からコンバンハ~

これらの続きとなっております。

それでは、今回は OpenCV を使ってカラー画像をグレースケールに変換していこうと思います。

storyboard に imageView, button をそれぞれ追加し、ViewController.swift にも追加し、
実際にコードを書いていこうと思います。

グレースケールに変換

OpenCVWrapper.mm

#import "OpenCVWrapper.h"
#import <opencv2/opencv.hpp>
#import <opencv2/highgui/ios.h>

@implementation OpenCVWrapper

+(NSString *) openCVVersionString
{
    return [NSString stringWithFormat: @"openCV Version %s", CV_VERSION];
}

+(UIImage * ) makeGrayFromImage:(UIImage *)image
{
    // transform UIImagge to cv::Mat
    cv::Mat imageMat;
    UIImageToMat(image, imageMat);
    
    // if the image already grayscale, return it
    if(imageMat.channels() == 1)return image;
    
    // transform the cv::Mat color image to gray
    cv::Mat grayMat;
    cv::cvtColor (imageMat, grayMat, CV_BGR2GRAY);
    
    return MatToUIImage(grayMat);
}

@end

import <opencv2/highgui/ios.h>でグレースケールにするためのライブラリを新たにインポートします。
UIImage型のままでは、変換できないので、UIImageToMat()メソッドで cv::mat型に変換します。
(cv::Mat は、画像のビットマップデータへのポインタと、幅,高さ,ビット深度などの様々なプロパティを保持するクラスです。)
cv::cvtColor ()で変換したら、MatToUIImage()で UIImage型にして返します。


OpenCVWrapper.h

#import <UIKit/UIKit.h>

@interface OpenCVWrapper : NSObject

// funciton to get opencv version
+(NSString * ) openCVVersionString;

// function to convert image to grayscale
+(UIImage * ) makeGrayFromImage:(UIImage * ) image;


ViewController.swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var openCVVersionLabel: UILabel!
    @IBOutlet weak var birdImageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.   
        openCVVersionLabel.text = OpenCVWrapper.openCVVersionString()
    }

    @IBAction func toGrayScaleButtonTouched(_ sender: UIButton) {
        birdImageView.image = OpenCVWrapper.makeGray(from: birdImageView.image)
    }

}


これで、アプリを実行し、ボタンをタップすると。



これが、

f:id:biwako_no_otyazuke:20161127105058p:plain:w400


これ、

f:id:biwako_no_otyazuke:20161127105122p:plain:w400

カラー画像がグレースケールになりましたね。
次回は、テンプレートマッチングをしてみようと思います!!

続きはこちら

【Swift】OpenCVを使ってみる 4 〜テンプレートマッチングしてみる〜 - 食後のSwift ~琵琶湖からコンバンハ~