2018-04-22[n年前へ]
■Python(Pythonista)でiOSカメラを自由自在に使ってみる
iPhone/iPadなどの機器のカメラは、焦点位置や露光時間や感度など、わりと細かく制御することができます。そうした撮影処理を使って、露光時間を変えた撮影を何枚もして画像(ハイダイナミックレンジ:HDR)合成をしたり、焦点位置を変えた撮影から焦点合成(フォーカススタッキング)を行ったりすると、意外に楽しいものです。とはいえ、そんなコード遊びをするのに、毎回Objective-C(やC++)でコーディングするのは少し面倒です。
というわけで、今日はiOSで動くPython ( Pythonista ) で、iOSのカメラをマニュアル撮影的に使うコードを書いてみました。それが下に貼り付けたPythonコード例です。この例では、焦点制御を無効化した上で、最近接位置から無限遠までのレンズ位置を0.0〜1.0の任意位置に制御しつ、撮影を行うことができます。
「開発用マシンでコードを書いてビルドした上で、スマホに転送して動かす」というような手間を掛けずとも、スマホ上で比較的短いコードを書いて、それをスマホ上で瞬時に動かして「自分だけの特殊撮影マシン」を仕立てて遊ぶことができるのは面白いものです。…今回貼り付けた撮影処理部分は全くPythonっぽくないコードですが、ひとたび「ライブラリ化」してしまえば、こんなコードを見る必要もなく、やりたいことだけをPythonから気楽に実行することができるようになります。…となれば、色々遊んでみたくなる人も多いのではないでしょうか。
# coding: utf-8 from objc_util import * import time AVCaptureSession = ObjCClass('AVCaptureSession') AVCaptureDevice = ObjCClass('AVCaptureDevice') AVCaptureDeviceInput = ObjCClass('AVCaptureDeviceInput') AVCapturePhotoOutput = ObjCClass('AVCapturePhotoOutput') def manualCapture(device, output, focusDistance, fileName): def captureOutput_didFinishProcessingPhotoSampleBuffer_ previewPhotoSampleBuffer_resolvedSettings_bracketSettings_error_( _self, _cmd, _output, _photoBuffer, _previewBuffer, _resolveSettings, bracketSettings, _error ): photoBuffer = ObjCInstance(_photoBuffer) jpegPhotoData = ObjCClass('AVCapturePhotoOutput' ).JPEGPhotoDataRepresentationForJPEGSampleBuffer_ previewPhotoSampleBuffer_( photoBuffer, _previewBuffer) jpegPhotoData.writeToFile_atomically_(fileName, True ) # delegate CameraManualPhotoCaptureDelegate = create_objc_class( 'CameraManualPhotoCaptureDelegate', methods=[ captureOutput_didFinishProcessingPhotoSampleBuffer_ previewPhotoSampleBuffer_resolvedSettings_bracketSettings_error_ ], protocols=[ 'AVCapturePhotoCaptureDelegate' ]) device.lockForConfiguration_(None) device.setFocusModeLockedWithLensPosition_completionHandler_( focusDistance, None) device.unlockForConfiguration() time.sleep(1) delegate = CameraManualPhotoCaptureDelegate.new() settings = ObjCClass('AVCapturePhotoSettings' ).photoSettings() settings.AVCaptureFocusMode = 0 output.capturePhotoWithSettings_delegate_( settings, delegate ) time.sleep(1) delegate.release() @on_main_thread def main(): session = AVCaptureSession.alloc().init() device = AVCaptureDevice.defaultDeviceWithMediaType_('vide') _input = AVCaptureDeviceInput.deviceInputWithDevice_error_( device, None) if _input: session.addInput_(_input) else: return session.startRunning() output = AVCapturePhotoOutput.alloc().init() session.addOutput_(output) time.sleep(1) manualCapture(device, output, 0.0, 'sample.jpg') time.sleep(1) session.stopRunning() session.release() output.release() if __name__ == '__main__': main()
2019-01-06[n年前へ]
■RAW/生画像の取得に対応したiOS/Pythonista 撮影ライブラリ
以前作成した(iOS上のPython環境である)Pythonista からiOSデバイスのマニュアル撮影などを簡単に行うことができるライブラリをアップデートして、RAW/生画像の取得ができるようにしてみました。まずは、github に仮版でアップロードしてあります。.DNGフォーマット保存だけでなく、(PythonistaだとPure Python でない rawpyといった.DNG読み込みが簡単にできるライブラリは使えませんから )RAW形式の画像ファイルをパースするのが面倒なPythonista ユーザ向けに、 「Python の numpy アレイ・バイナリデータとして保存する機能」も付けてみました。
というわけで、下の画像は、そんな「RAW/生画像の取得に対応したiOS/Pythonista 撮影ライブラリ」を使い、1段置きの8段階の露出スピード違いで(各14bitの情報を)撮影し、つまり、実情報として8+14 = 22 bit のHDR画像取得をしてみた撮影結果例です。…このHDR合成については、また明日にでもHDR合成用のPythonコードも含めて、メモ書きしてみようと思います。
2019-01-09[n年前へ]
■iOS / Pythonista で書く、AR的な実世界各種センサのスキャニング
@kenkawakenkenke さんのAR的磁場可視化が面白かったのと、似たことをやってみたかったので、iOS/PythonistaでAR磁場可視化を書いてみました。実装言語が、iOS上でユーザが自由にインタプリタ実行できるPythonistaなので、ユーザのしたいことに応じて、自由自在にカスタマイズ可能です。
つまり、iPhone搭載センサや、あるいはBLE経由の各種センサとか、あるいはそれ以外の各種拡張を、使い手が自由に考え・形にしやすいと思います。…コードは近くアップロードした上で、いつものようにコード・解説全て含めて込み込み4ページ!な記事にでもしてみようかな、と考えています。
そしてまた、実世界の中で、場所や方向やすべてに応じた各種取得情報をリアルタイムに解析するツールに興味ある方などいらっしゃれば、いつでもご連絡下さい。