« オブジェクト認識002
processing java
| トップページ | エッジ検出
processing java »

2010.07.22

オブジェクト認識003 ラベル処理
processing java



これこれ、想定していたとおりにやっとなった。


package faceCatch;

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

public class Label_new002 extends PApplet{

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

        private static final long serialVersionUID = 1L;

        //閾値
        float iThresh = 100.0f;

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

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

        //ピクセルの値を格納する変数
        int pixColor;

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

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

        //ラベルの色
        int labelColor;

        //4近傍変数
        int top, bottom, left, right, leftTop, rightTop, leftBottom, rightBottom;

        int endCell = (320 * 240) - 1;

        //labelIDごとに変化する色の値
        int idColor = 0xff223366;

        //近傍値検査のカウンター
        int cellCun;

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

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

        }

        public void setup(){

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

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

        } //end of setup()


        public void draw(){
                //ラベルのID
                int labelID = 1;
                //map宣言初期化
                int labelMap[] = new int[width * height];
                //カラーの初期化
                idColor = 0xff334455;

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

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

                                //ピクセルの位置
                                pos = (i * width) + j;
                                //ピクセルの値を取得する(RGB)
                                pixColor = camera.pixels[pos];

                                //明度の抽出
                                b = brightness(pixColor);

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

                                        pixels[pos] = BLACK;

                                } else {

                                        pixels[pos] = WHITE;

                                }

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



                //ラベリング処理開始
                for(int i = 0; i < height; i++){
                        for(int j = 0; j < width; j++){

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

                                //ピクセルが白かを調べる
                                if(pixels[posss] == WHITE){

                                        //ピクセルが白だったらIDを付加して色をつける
                                        setLabel(posss, labelID, labelMap);

                                        //処理が終了したらIDを加算
                                        labelID++;

                                        //カラーの加算
                                        idColor += 0xff112233;


                                } //end of if
                        }
                } //end of for()

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


        } //end of draw()



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



        private void setLabel(int myPosition, int labelID, int labelMap[]){

                //自分の印を付ける
                labelMap[myPosition] = labelID;
                pixels[myPosition] = RED;

                do{
                        //近傍値のカウント
                        cellCun = 0;

                        for(int i = 0; i < height; i++){
                                for(int j = 0; j < width; j++){

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

                                        //myPositionを見つける
                                        if(labelMap[pos] == labelID){

                                                //近傍値検査

                                                //上ピクセルの検査
                                                if(pos > width - 1){//一行目より大きいとき
                                                        top = pos - width;
                                                        if(pixels[top] == WHITE){
                                                                labelMap[top] = labelID;
                                                                pixels[top] = idColor;

                                                                //カウントアップ
                                                                cellCun++;
                                                        }
                                                }

                                                //下ピクセルの検査
                                                if(pos < width * (height -1)){
                                                        bottom = pos + width;
                                                        if(pixels[bottom] == WHITE){
                                                                labelMap[bottom] = labelID;
                                                                pixels[bottom] = idColor;

                                                                //カウントアップ
                                                                cellCun++;
                                                        }

                                                }

                                                //右ピクセルの検査
                                                if(pos != (width * (i + 1)) - 1){
                                                        right = pos + 1;
                                                        if(pixels[right] == WHITE){
                                                                labelMap[right] = labelID;
                                                                pixels[right] = idColor;

                                                                //カウントアップ
                                                                cellCun++;
                                                        }
                                                }

                                                //左ピクセルの検査
                                                if(pos != width * i){
                                                        left = pos - 1;
                                                        if(pixels[left] == WHITE){
                                                                labelMap[left] = labelID;
                                                                pixels[left] = idColor;

                                                                //カウントアップ
                                                                cellCun++;
                                                        }
                                                }
                                        }
                                }
                        }

                } while(cellCun != 0);
        }


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


}



3次元画像処理入門 3次元画像処理入門

価格 : ¥2,835 (税込み)

入門的な3次元画像処理の書籍としては国内初。3次元画像処理を学部・院レベルで講義する際に最適な教科書。

|

« オブジェクト認識002
processing java
| トップページ | エッジ検出
processing java »

processing」カテゴリの記事

コメント

コメントを書く



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




トラックバック

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

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

« オブジェクト認識002
processing java
| トップページ | エッジ検出
processing java »