hirax.net::Keywords::「Python」のブログ



2017-10-27[n年前へ]

スマホの1ショット撮影でHDR(ハイダイナミックレンジ)画像を作り出してみる!? 

 機械学習を使った「単一露光画像からのHDR(ハイダイナミックレンジ)画像生成」の Paper PDF が出ていて、プロジェクトページ には Tensorflow / Pythonによるコードが公開されていた。

 そこで、まずは iPhone 6s で撮影した1ショット RAW(DNG)画像(右)から、詳細がわかるように…というかGPUメモリが許す画像サイズに切り抜いた上で、HDR画像を生成してみました。それが下の結果です。下左側画像が(1ショット単一露光画像)入力画像で、下右側が機械学習が出力したHDR画像です。相対的に明るすぎて白飛びしている箇所が、それっぽくHDR生成されていることがわかります。

 最近のスマホなら、高速連写機能を使ったHDR撮影が普通にできる時代です。とはいえ、動画撮影をするときは、そんなHDR処理が働かないもの。…ということは、撮影した「動画」が白飛びしていたりしたら、こんな機械学習による単一露光条件動画からのHDR動画を作り出してみるのも良いかもしれません。

 ところで、下に貼り付けた画像は、全天周カメラ Ricoh Theta で撮影した単一露光条件の低解像度画像から生成してみたHDR画像です。…こうした全天周画像に対して機械学習で使われるCNN(Convolutional Neural Network)処理を掛けようとすると、XY座標系の2次元画像ではなく、曲率を持つ球表面に適用可能なCNN画像処理を掛けたくなります。…そんな全天周画像処理を探す旅に出たくなります。

スマホの1ショット撮影でHDR(ハイダイナミックレンジ)画像を作り出してみる!?スマホの1ショット撮影でHDR(ハイダイナミックレンジ)画像を作り出してみる!?スマホの1ショット撮影でHDR(ハイダイナミックレンジ)画像を作り出してみる!?スマホの1ショット撮影でHDR(ハイダイナミックレンジ)画像を作り出してみる!?スマホの1ショット撮影でHDR(ハイダイナミックレンジ)画像を作り出してみる!?






2017-11-18[n年前へ]

Software Design 12月号「物理と数学、そしてプログラミング」 

 今週末に発売された Software Design 12月号 に、「第1特集 ITエンジニアと数学」中の4時限目(「物理と数学、そしてプログラミング」)として、駄文を書かせて頂きました。 記事書きのために書いたサンプル Jupyter ノートブックは、ここに置いておきます

 世界を方程式で表して、何が起きるかを計算する物理(科学)計算プログラム…言葉だけ眺めると、一見とても難しく思えます。けれど、実は「わりと簡単なのにとても楽しい」ものです。…それが少しでも伝わって、あなたの口癖が(ガリレオ湯川先生みたいな)こんなフレーズになれば幸いです。
「なるほど、実に面白い」

Software Design 12月号「物理と数学、そしてプログラミング」Software Design 12月号「物理と数学、そしてプログラミング」






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()

Python(Pythonista)でiOSカメラを自由自在に使ってみる








■Powered by yagm.net