2017-08-01[n年前へ]
■300円くらいで「高性能な立体顕微鏡」を作ってみよう!?
先日、「3000円くらいの立体顕微鏡」を作ってみました。けれど、3000円ではまだ高い!というわけで、そのさらに10分の1のお小遣いでも買える「300円くらいの立体顕微鏡」を作ってみました。
「やったこと」をひとことで言うと、300円ほどで買ったスマホ用レンズを使って、スマホからの特殊撮影をすることで、300円のレンズ+スマホを立体顕微鏡に仕立ててみました。
たとえば、下に貼り付けたのは、深圳の油画村(大芬油画村)で買った「油絵」の表面を撮影してみたものです。油絵具材の盛り上がりのようすが見てとれます。こんなようすが、300円程度のレンズとスマホを使って撮影できるのは、結構面白いのではないでしょうか。
下に貼り付けたテスト撮影を眺めると「千円札のインク盛り上がり」くらいなら撮影できそうな感じです。
この後は、レーウェンフック系の単レンズ顕微鏡用のボールレンズや「水滴「など、各種安レンズを使ったテスト撮影を行った上で、来週には、コストはさらに10分の1・解像度はさらに10倍くらいの世界を目指してみたいと思います。 10ミクロンオーダーくらいの面内&高さ精度の立体顕微鏡を、100円玉一個くらいで実現するのが来週の目標です。…そして、今年2017年の夏休みの終わり頃には、それを誰でも使えるようにしてみたいと思います(と、日記には書いておこう)。
2017-08-21[n年前へ]
■続 300円くらいで「高性能な立体顕微鏡」を作ってみよう!?
300円くらいで「高性能な立体顕微鏡」を作ってみよう!?で試した、約300円で買ったスマホ用レンズで特殊撮影+後処理+3D表示をするソフトウエアを、スマホ(iOS)単体で行うことができるようにする作業をしています。
そんな「300円でできるスマホ立体顕微鏡ソフト」を作る作業をしていると、スマホが「ありとあらゆるセンサー」と「昔のスパコンレベルの計算能力」を備えているために、なんだかとても楽しくてハマっているところです。
いわゆる「8月31日まで」の夏休みの終わり・・・までに終えることはできそうにないですが、9月の終わりくらいまでには一旦リリースしたいなと思っています。
2017-12-21[n年前へ]
■空を限りない青空にするスマホ版「偏光カメラ」を作ってみよう!?
3年半くらい前に作った(コンパクトデジカメを使った)偏光カメラを、スマホ版として作り直してみました。スマホに、秒24回転くらいの回転偏光フィルタユニットを取り付けることができるようにして、スマホを240コマ/秒くらいの高速撮影モードにすることで、秒24コマの特殊な動画撮影を行うことができるカメラを(今や一人一台誰もが持ちつつあるスマホを使って)仕立ててみた…というわけです。
空を限りなく青空にして、そこにあるものの色を可能な限り純色にする、そんな特殊な動画撮影を、ほぼ全てのスマホで行うことができるようになります。一体どんな特殊撮影が可能になるかというと…たとえば、下に貼り付けた画像は、普通に撮影した画像(左)と映り込みを極限まで減らして、色をできるだけ鮮やかにした画像(右)の例です。
右上の画像では、物体表面の散乱反射光が(可能な限り)減らされています。つまり、空気の中で生じる光散乱光をとても減らした結果、まるで「空気が無い宇宙空間に、街が佇んでいる」ような、「昼間のような、夜間のような」…不思議な街景色になっていることがわかります。
色鮮やかにするだけでなく、たとえば下に貼り付けた動画のように、その他にも色んなことができます。…けれど、そんなエトセトラは、また週末にでも遊んでみることにしようと思います。
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()