2014年9月22日月曜日

Swiftでカメラアプリを作る。

最近、暇を見つけてはSwiftを勉強しています。
今日は半日くらいマルッと使えそうだったので、Swiftでカメラアプリなぞ作ってみました。

先人達のコードを参考にしつつ、XCode6.01のSwiftで書き直してあります。

コードはこちら。 Github

どーせ書き方が違うだけだろと思ってたんですが、全然そうでもなく、Obj-Cで書いたプログラムをそのまま書き直せば動くっていう感じでは無さそうです。
また、言語としての抽象度が上がっているので、逆に色々ハマりどころがあります。

以下ハマった所。
なかなかdeviceInputが取得出来なくて苦労しました。サンプルを持って来ると何故かnilが帰ってくるという。とりあえず、こんな感じに修正して動きました。


    var videoDevice:AVCaptureDevice?

~~~~~~~~~~~~~中略~~~~~~~~~~~~~~~~
        var error:NSError?
        videoDevice = CameraViewController.device(AVMediaTypeVideo, position: AVCaptureDevicePosition.Back)
        let videoDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(videoDevice!, error: &error) as AVCaptureDeviceInput

~~~~~~~~~~~~~中略~~~~~~~~~~~~~~~~
    class func device(mediaType: NSString!, position: AVCaptureDevicePosition) -> AVCaptureDevice? {
        var devices = AVCaptureDevice.devicesWithMediaType(mediaType) as [AVCaptureDevice]
        
        if devices.isEmpty {
            return nil
        }
        
        var captureDevice = devices[0]
        for device in devices {
            if device.position == position {
                captureDevice = device
                break
            }
        }
        return captureDevice
    }


あとイメージをキャプチャして保存するのが結構ハマりました。


 
    func takePict(sender: AnyObject){

        var layer : AVCaptureVideoPreviewLayer = previewLayer! as AVCaptureVideoPreviewLayer
        
        self.stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo).videoOrientation = layer.connection.videoOrientation
        
        var error:NSError
        
        self.stillImageOutput?.captureStillImageAsynchronouslyFromConnection(self.stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo), completionHandler: {
            (imageDataSampleBuffer,error) -> Void in
            if ((imageDataSampleBuffer) != nil) {
                var imageData : NSData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
                var image : UIImage = UIImage(data: imageData)
                ALAssetsLibrary().writeImageToSavedPhotosAlbum(image.CGImage, orientation: ALAssetOrientation.fromRaw(image.imageOrientation.toRaw())!, completionBlock: nil)
            }
        })

    }
一応こんな感じで何とか動いてます。(正直まだ良く分からない所が多い。)

なんというか、Obj-Cよりも難しいなと思うのは、書き方のパターンが色々ある所とXcodeがまだ自動補完とか完全で無い感じの所ですね。
構造体とかの使い方が特徴的らしいので、その辺りをマスターすればよりSwiftっぽい書き方になるんじゃないかなーと思います。

参考になれば幸いです。

2014年9月21日日曜日

ipython notebookとscikit-learn

だいぶご無沙汰です。
ここの所、iOSやったりAndroidやったり色々でした。
ちょっとアルゴリズムの検証として数値計算するニーズがありまして、Rでも覚えようかどうしようかなと思っていた所kzfmさんからipython notebookとscikit-learnがいいよと教えて貰ったので、早速インストールしてみました。
インストールはpythonのパッケージ管理ツールpipが動けば全然楽勝だったんですが、最初easy_install pipしても
DistributionNotFound: setuptools==0.6c12dev-r85381
とか言われて全然インストール出来ず。ググったら親切な外人が/usr/bin/local/以下のeasy_installが複数入ってる可能性があるから一個消せば動くよって教えてくれたので、解消しました。感謝!


で、pipが動く様になったら後は楽勝です。まずは、ipythonのインストールから。あ、環境はMac OSX marverikです。
$ sudo pip install ipython
としてから、
$ sudo pip install jinja2
$ sudo pip install tornado
$ sudo pip install pyzmq
として
$ ipython notebook
ってやると、おもむろにブラウザがこんな感じで立ち上がります。こりゃ便利そう。


んで、数値計算の方なんですが、scikit-learnを動かすにはnumpy,scipyが必要なので、こちらもpipでインストールしてから、
$ sudo pip install scikit-learn
でインストール完了です。どうも途中Xcodeのcommand line toolが必要みたいなんですが、既に入ってるので、問題ナッシンでした。

とりあえず、これで準備は完了なんですが、とりあえず色々触ってみたいと思います。