iSightでキャプチャ第2弾

さて本日もiSight + QuickTime for Javaで行きます。

本日やったことは、
・本来取得していた画像を左右反転させる
・明度が一番高い部分を検出する
の二つです。

左右反転はまあBufferedImageにしてBufferedImageからgetRGBして、その値を反対側に・・・というのを繰り返すだけです。簡単。
でもその処理が純粋にCPU任せなのでJavaでやると目に見えてFPSが落ちます。QTJのネイティブコード部分でなんとかできないものかなーとか考えてはいますがなにぶん英語が。なんか悔しくなってきた。

明度が一番高いところを検出っていうのもBufferedImageのピクセルを全部線形に探索して探せば良いだけです。
問題は明度をどうやって求めるのか、と。
ここではYCrCbをつかった色の表示系を使います。
Yが明度、CrとCbが色差。RGBからYCrCbを求めるには以下の式を使うそうです。

Y = 0.299 × R + 0.587 × G + 0.114 × B
Cr = 0.500 × R - 0.419 × G - 0.081 × B
Cb = -0.169 × R - 0.332 × G + 0.500 × B

CrとCbは放置して今回はYだけ使いました。
Yの値が一番大きいところを探します。
で、その一番明るい部分に○を描きます。(上の写真)

以上。
やってることはProcessingの
/examples/Libraries/Video (Capture)/BrightnessTracking/BrightnessTracking.pde
と同じです。
ほかにもいろいろまねしてやってみよう。