topical media & game development
student-ar-org-libspark-flartoolkit-core-match-FLARMatchPatt-Color-WITHOUT-PCA.ax
student-ar-org-libspark-flartoolkit-core-match-FLARMatchPatt-Color-WITHOUT-PCA.ax
[swf]
flex
/*
* PROJECT: FLARToolKit
* --------------------------------------------------------------------------------
* This work is based on the NyARToolKit developed by
* R.Iizuka (nyatla)
* http://nyatla.jp/nyatoolkit/
*
* The FLARToolKit is ActionScript 3.0 version ARToolkit class library.
* Copyright (C)2008 Saqoosha
*
* 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 2
* 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 framework; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* For further information please contact.
* http://www.libspark.org/wiki/saqoosha/FLARToolKit
* <saq(at)saqoosha.net>
*
*/
package org.libspark.flartoolkit.core.match {
import org.libspark.flartoolkit.utils.ArrayUtil;
import org.libspark.flartoolkit.core.FLARCode;
import org.libspark.flartoolkit.core.pickup.IFLARColorPatt;
AR_TEMPLATE_MATCHING_COLORかつAR_MATCHING_WITHOUT_PCAと同等のルールで マーカーを評価します。
public class @ax-student-ar-org-libspark-flartoolkit-core-match-FLARMatchPatt-Color-WITHOUT-PCA implements IFLARMatchPatt {
// private int[][][] input = new int[1][1][3];
private var input:Array = ArrayUtil.createJaggedArray(1, 1, 3);
private var datapow:Number;
private var width:int = 1;
private var height:int = 1;
private var cf:Number = 0;
private var dir:int = 0;
public function getConfidence():Number {
return cf;
}
public function getDirection():int {
return dir;
}
input配列サイズを必要に応じて再アロケートする。
parameter: i_width
parameter: i_height
private function reallocInputArray(i_width:int, i_height:int):void {
if (this.input.length < i_height || this.input[0].length < i_width) {
// 配列が十分なサイズでなければ取り直す
this.input = ArrayUtil.createJaggedArray(i_height, i_width, 3);//new int[i_height][i_width][3];
}
this.height = i_height;
this.width = i_width;
}
public function setPatt(i_target_patt:IFLARColorPatt):Boolean {
var i:int;
var k:int;
var data:Array; // int[][][]
var linput:Array; // int[][][]
// input配列のサイズとwhも更新// input=new int[height][width][3];
reallocInputArray(i_target_patt.getWidth(), i_target_patt.getHeight());
var lwidth:int = this.width;
var lheight:int = this.height;
linput = this.input;
data = i_target_patt.getPatArray();
var sum:int = 0;
var l_ave:int = 0;
var w_sum:int;
var data_i:Array; // int[][]
var input_i:Array; // int[][]
var data_i_k:Array; // int[]
var input_i_k:Array; // int[]
for (i = lheight - 1;i >= 0; i--) {
// <Optimize/>for(int i=0;i<height;i++) {
//for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){
data_i = data[i];
for (k = lwidth - 1;k >= 0; k--) {
// <Optimize/>for(int
// i2=0;i2<Config.AR_PATT_SIZE_X;i2++){
// <Optimize/>l_ave +=(255-data[i][i2][0])+(255-data[i][i2][1])+(255-data[i][i2][2]);
data_i_k = data_i[k];
l_ave += 255 * 3 - data_i_k[0] - data_i_k[1] - data_i_k[2];
}
}
l_ave /= (lheight * lwidth * 3);
for (i = lheight - 1;i >= 0; i--) {
// for(i=0;i<height;i++){//for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){
input_i = linput[i];
data_i = data[i];
for (k = lwidth - 1;k >= 0; k--) {
// for(i2=0;i2<width;i2++){//for(int i2=0;i2<Config.AR_PATT_SIZE_X;i2++){
// <Optimize>
// for(int i3=0;i3<3;i3++){
// input[i][i2][i3] = (255-data[i][i2][i3]) - l_ave;
// sum += input[i][i2][i3]*input[i][i2][i3];
// }
data_i_k = data_i[k];
input_i_k = input_i[k];
w_sum = (255 - data_i_k[0]) - l_ave;
input_i_k[0] = w_sum;
sum += w_sum * w_sum;
w_sum = (255 - data_i_k[1]) - l_ave;
input_i_k[1] = w_sum;
sum += w_sum * w_sum;
w_sum = (255 - data_i_k[2]) - l_ave;
input_i_k[2] = w_sum;
sum += w_sum * w_sum;
// </Optimize>
}
}
datapow = Math.sqrt(sum);
if (datapow == 0.0) {
return false;// throw new FLARException();
// dir.set(0);//*dir = 0;
// cf.set(-1.0);//*cf = -1.0;
// return -1;
}
return true;
}
public int pattern_match(short[][][] data,IntPointer dir,DoublePointer
cf)
public function evaluate(i_code:FLARCode):void {
var pat:Array = i_code.getPat(); // int[][][][]
var patpow:Array = i_code.getPatPow(); // double[]
var res:int = -1;
var max:Number = 0.0;
var pat_j:Array; // int[][][]
var linput:Array; // int[][][]
var pat_j_i:Array; // int[][]
var input_i:Array; // int[][]
var pat_j_i_k:Array; // int[]
var input_i_k:Array; // int[]
var l_width:int = this.width;
var l_height:int = this.height;
linput = this.input;
var sum:int;
var i:int;
var k:int;
var sum2:Number;
for (var j:int = 0;j < 4; j++) {
sum = 0;
pat_j = pat[j];
for (i = l_height - 1;i >= 0; i--) {
// for(int i=0;i<Config.AR_PATT_SIZE_Y;i++){
input_i = linput[i];
pat_j_i = pat_j[i];
for (k = l_width - 1;k >= 0; k--) {
pat_j_i_k = pat_j_i[k];
input_i_k = input_i[k];
// for(int i3=0;i3<3;i3++){
sum += input_i_k[0] * pat_j_i_k[0];
// sum +=input[i][i2][i3]*pat[k][j][i][i2][i3];
sum += input_i_k[1] * pat_j_i_k[1];
// sum +=input[i][i2][i3]*pat[k][j][i][i2][i3];
sum += input_i_k[2] * pat_j_i_k[2];// sum +=input[i][i2][i3]*pat[k][j][i][i2][i3];
// }
}
}
sum2 = sum / patpow[j] / datapow;
// sum2 = sum / patpow[k][j]/ datapow;
if (sum2 > max) {
max = sum2;
res = j;
}
}
dir = res;
cf = max;
}
}
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.