まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

OpenCVを使ってリアルタイムに顔認識

やはりリアルタイムに認識するのは重いですね。そりゃそうですよね、iPhoneだもの。

1.いつものようにプロジェクトファイルを作って、いったんXCodeを終了する
2.ターミナルを開き、以下を行う
[sudo] gem install cocoapodsと入力してリターンキーを押す
pod setupと入力してリターンキーを押す
3.いったんターミナルを終了する
4.ターミナルを開き、cdと入力した後にスペースを押す。そして1.のプロジェクトファイル(ファイル名.xcodeprojが入っているフォルダ)を
ドラッグ&ドロップする。そうするとパスが表示されます。そのままリターンキーを押す
5.pod initと入力
6.ターミナルを終了する。プロジェクトファイルが入ったフォルダの中にPodfileというファイルが出来ているので、それを
miなどのテキストエディタで開き、以下のように編集して保存する。
注:どうも2.4.10ではバグがあるようです。あとpod 'OpenCV'だけではダメで、バージョンも入れる必要があります

# Uncomment this line to define a global platform for your project
# platform :ios, '8.0'

target 'opencvTest4' do
pod 'OpenCV', '2.4.9'
end

target 'opencvTest4Tests' do

end

7.4.と同じ
8.pod installと入力し、リターンキーを押す
9.ファイル名.xcworkspaceをダブルクリックして開く
10.こちらを参照してファイルを作ったりコードを入力していく(ありがとうございます)
11.CameraUtil.swiftを以下のように書き換えたほうが良いっぽい

import Foundation
import UIKit
import AVFoundation

class CameraUtil {
    
    // sampleBufferからUIImageへ変換
    class func imageFromSampleBuffer(sampleBuffer: CMSampleBufferRef) -> UIImage {
        let imageBuffer: CVImageBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)
        
        // ベースアドレスをロック
        CVPixelBufferLockBaseAddress(imageBuffer, 0)
        
        // 画像データの情報を取得
      
         let baseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)
        let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
      let width = CVPixelBufferGetWidth(imageBuffer)
        let height = CVPixelBufferGetHeight(imageBuffer)
        
        // RGB色空間を作成
         let colorSpace = CGColorSpaceCreateDeviceRGB()
        
        // Bitmap graphic contextを作成
        let bitsPerCompornent: UInt = 8
        var bitmapInfo = CGBitmapInfo((CGBitmapInfo.ByteOrder32Little.rawValue | CGImageAlphaInfo.PremultipliedFirst.rawValue) as UInt32)
        
        let context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, bitmapInfo)
        
        
        // Quartz imageを作成
        let imageRef = CGBitmapContextCreateImage(context)
        
        // ベースアドレスをアンロック
        CVPixelBufferUnlockBaseAddress(imageBuffer, 0)
        
        // UIImageを作成
        let resultImage: UIImage = UIImage(CGImage: imageRef)!
        
        return resultImage
    }
    
}