« I.S まんが日本昔ばなし 「片ひたのわらじ」 | トップページ | ムービーシーケンス002 »

2010.07.20

オブジェクト認識
processing java

2値化に成功したので2値化からオブジェクト認識に挑戦。
処理の進め方に自分自身納得が行かないというか、どこか違うように思えてならない。
余計なことしてるきがする。どっか間違ってるな〜。やろうとしていることと違う。うーん。OpenCVつかっちゃおうかな、、、

Label2



package faceCatch;

import processing.core.PApplet;
import processing.video.*;

public class Label extends PApplet{

        ///////////////////////////////////////////

        private static final long serialVersionUID = 1L;

        //閾値
        float iThresh = 100.0f;

        //カメラオブジェクトの変数
        Capture camera;

        //平均値
        int pixAverage;

        //ループ変数
        int i, j;

        //ピクセルの位置を格納する変数
        int pos;

        //明度値を格納する変数
        float b;

        //カラー
        final int WHITE = 0xffffffff;
        final int BLACK = 0xff000000;
        final int RED   = 0xffff0000;

        //ラベルのID
        int labelID;

        //ラベル識別MAP
        int labelMap[];

        //ラベルの色
        int labelColor;

        //4近傍変数
        int top, bottom, left, right;

        int celMax = (320 * 240) - 1;

        ///////////////////////////////////////////

        //コンストラクタ
        public Label(){

        }

        public void setup(){

                size(320, 240);
                colorMode(HSB, 256);

                //Captureオブジェクトの準備
                camera = new Capture(this, 320, 240, 30);

                //ラベルmapの準備
                labelMap = new int[width * height];



        } //end of setup()


        public void draw(){

                //カメラ画像のピクセルをロード
                camera.loadPixels();
                //画面のピクセルのロード
                loadPixels();

                //ピクセルの検査2値化
                for(i = 0; i < height; i++){
                        for(j = 0; j < width; j++){

                                //ピクセルの位置
                                pos = (i * width) + j;

                                //明度の抽出
                                b = brightness(camera.pixels[pos]);

                                //明度が設定した閾値より上か下か
                                if(b <= iThresh){

                                        pixels[pos] = BLACK;

                                } else {

                                        pixels[pos] = WHITE;

                                }

                        }
                } //end of for() 2値化完了

                //ラベリング処理開始全てのピクセルから白いピクセルを調べる
                for(i = 0; i < height; i++){
                        for(j = 0; j < width; j++){

                                //ピクセルの位置
                                pos = (i * width) + j;

                                //ピクセルが白とき
                                if(pixels[pos] == WHITE){

                                        //自分の周りに白いピクセルがあるか探すメソッドの実行
                                        setLabel(pos, labelID);
                                        labelID++;
                                } //end of if
                        }
                } //end of for()

                //ピクセルのアップデート
                updatePixels();
        } //end of draw()


        //ラベリングと4近傍の検査
        private void setLabel(int position, int mylabelID){

                //自分の位置pixels[position]が白であると確定している時ここにいる
                labelMap[position] = mylabelID;
                pixels[position] = RED;

                //自分の回りに白いピクセルが無くなるまで調べ続ける
                for(i = 0; i < height; i++){
                        for(j = 0; j < width; j++){
                                //ピクセルの位置
                                int poss = (i * width) + j;

                                if(labelMap[position] == mylabelID){
                                        //近傍値
                                        //一つ上の検査
                                        if(poss > width){
                                                top = poss - width;
                                                if(pixels[top] == WHITE){
                                                        labelMap[top] = mylabelID;
                                                        //色を塗る
                                                        pixels[top] = RED;
                                                }
                                        }

                                        //一つ下の検査
                                        if(poss < width * (height - 1)){
                                                bottom = poss + width;
                                                if(pixels[bottom] == WHITE){
                                                        labelMap[bottom] = mylabelID;
                                                        //色を塗る
                                                        pixels[bottom] = RED;
                                                }
                                        }

                                        //一つ左の検査
                                        if(poss % width != 0 && poss != 0){
                                                left = poss - 1;
                                                if(pixels[left] == WHITE){
                                                        labelMap[left] = mylabelID;
                                                        //色を塗る
                                                        pixels[left] = RED;
                                                }
                                        }

                                        //一つ右の検査
                                        if(poss != (width - 1) * i && poss != celMax){
                                                right = poss + 1;
                                                if(pixels[right] == WHITE){
                                                        labelMap[right] = mylabelID;
                                                        //色を塗る
                                                        pixels[right] = RED;
                                                }
                                        }
                                } //end of if()
                        }
                } //end of for()


        } //end of setLabel()


        //キャプチャ映像のイベントハンドラ
        public void captureEvent(Capture camera){
                camera.read();
        } //end of captureEvant


}



OpenCV OpenCV
コンピュータビジョンライブラリを使った画像処理・認識


価格 : ¥4,830 (税込み)

コンピュータが「目」を持ち、情報に基づいて意思決定することが可能なアプリケーションをどう開発するかについて、OpenCVの開発者であるGary Bradski氏が詳しく解説します。
本書を読めば、研究者や開発者も電子ホビーストもOpenCVが提供するフレームワークの使い方を身につけてすぐに活用できます。

|

« I.S まんが日本昔ばなし 「片ひたのわらじ」 | トップページ | ムービーシーケンス002 »

processing」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/198455/48927950

この記事へのトラックバック一覧です: オブジェクト認識
processing java
:

« I.S まんが日本昔ばなし 「片ひたのわらじ」 | トップページ | ムービーシーケンス002 »