/*
* PROJECT: NyARToolkitAS3
* --------------------------------------------------------------------------------
* This work is based on the original ARToolKit developed by
* Hirokazu Kato
* Mark Billinghurst
* HITLab, University of Washington, Seattle
* http://www.hitl.washington.edu/artoolkit/
*
* The NyARToolkitAS3 is AS3 edition ARToolKit class library.
* Copyright (C)2010 Ryo Iizuka
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* For further information please contact.
* http://nyatla.jp/nyatoolkit/
* or
*
*/
package jp.nyatla.nyartoolkit.as3.core.match
{
import jp.nyatla.nyartoolkit.as3.core.raster.*;
public class NyARMatchPattDeviationBlackWhiteData
{
private var _data:Vector.;
private var _pow:Number;
//
private var _number_of_pixels:int;
public function refData():Vector.
{
return this._data;
}
public function getPow():Number
{
return this._pow;
}
public function NyARMatchPattDeviationBlackWhiteData(i_width:int,i_height:int)
{
this._number_of_pixels=i_height*i_width;
this._data=new Vector.(this._number_of_pixels);
return;
}
/**
* XRGB[width*height]の配列から、パターンデータを構築。
* @param i_buffer
*/
public function setRaster(i_raster:INyARRaster):void
{
//i_buffer[XRGB]→差分[BW]変換
var i:int;
var ave:int;//
var rgb:int;//
var linput:Vector.=this._data;//
var buf:Vector.=Vector.(i_raster.getBuffer());
// input配列のサイズとwhも更新// input=new int[height][width][3];
var number_of_pixels:int=this._number_of_pixels;
//<平均値計算(FORの1/8展開)/>
ave = 0;
for(i=number_of_pixels-1;i>=0;i--){
rgb = buf[i];
ave += ((rgb >> 16) & 0xff) + ((rgb >> 8) & 0xff) + (rgb & 0xff);
}
ave=(number_of_pixels*255*3-ave)/(3*number_of_pixels);
//
var sum:int = 0,w_sum:int;
//<差分値計算/>
for (i = number_of_pixels-1; i >= 0;i--) {
rgb = buf[i];
w_sum =((255*3-(rgb & 0xff)-((rgb >> 8) & 0xff)-((rgb >> 16) & 0xff))/3)-ave;
linput[i] = w_sum;
sum += w_sum * w_sum;
}
var p:Number=Math.sqrt(Number(sum));
this._pow=p!=0.0?p:0.0000001;
return;
}
}
}