iSightで。第4弾

QuickTime for Javaも第4弾に。
やったことは、
一つ前の画像と今の画像を比較して、明るさが大きく変化していたら大きく四角を描く
というもの。

フラッシュ形式でムービーを保存してあるんだけど、はてなだとどうやって公開すれば良いかねぇ・・・。

「Built with Processing デザイン/アートのためのプログラミング入門」(著者:前川峻志、田中孝太郎)のp171にあるstep 03-aを完全にJavaで書いたものです。ほぼ同じ動作をするようになっているはず。

独自のクラスとか使ってるんであんまり参考にならないと思いますけど一応アルゴリズム的な参考になればいいな、ということで描画を担当するメソッドはこんな感じ。

   /**
     * 前の画像との差を四角で描画します
     * @param iio 加工したいイメージを保持するImgIOクラス
     * @param img バッファ用イメージ
     */
    public void drawDifferenc(ImgIO iio, BufferedImage img) {
        
        //イメージの大きさ
        int w = img.getWidth();
        int h = img.getHeight();
 
        //Graphicsを取得
        Graphics2D gbg = (Graphics2D) img.getGraphics();
        
        //α値を設定。1.0は不透明。
        gbg.setComposite(AlphaComposite.getInstancs(
            AlphaComposite.SRC_OVER,1.0f));
        
        //一つ前の画像がnullだったら何もしない
        if (oldImgIO != null) {
            for (int y = 0; y < h; y=y+10) {
                for (int x = 0; x < w; x = x+10) {
                    
                    //明度を取得
                    double Y = iio.getAveYValue(x, y, 1, 1);
                    
                    //一つ前の画像から明度を取得
                    double oldY = oldImgIO.getAveYValue(x, y, 1, 1);
                    
                    //差の絶対値を取得する
                    double diff = Math.abs(oldY - Y);
                    
                    //明度が大きく変わっているところを動きがあったところと認識する
                    if (diff > 20) {
                        
                        //新しい方の色を取得
                        gbg.setColor(new Color(
                                iio.getRgb(x, y)[1],
                                iio.getRgb(x, y)[2],
                                iio.getRgb(x, y)[3]));
                        //上の色で塗りつぶされた四角形を描画
                        gbg.fillRect(x - (int) (diff/4), y - (int) (diff/4),
                                (int) diff / 2, (int) diff / 2);
                        
                    }
                }
            }
        }
        //画像のコピーを保存する
        oldImgIO = new ImgIO(iio.copyImage());
        
        //Graphicesを破棄
        gbg.dispose();
    }


このコードを利用することであなたに被害を被ったとしても、私、白峰はなんの関与もしないこととします。
というお約束。