topical media & game development

talk show tell print

student-ar-org-libspark-flartoolkit-core-rasterfilter-rgb2bin-FLARRasterFilter-ARToolkitThreshold.ax

student-ar-org-libspark-flartoolkit-core-rasterfilter-rgb2bin-FLARRasterFilter-ARToolkitThreshold.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.rasterfilter.rgb2bin {
          import org.libspark.flartoolkit.FLARException;
          import org.libspark.flartoolkit.core.raster.IFLARRaster;
          import org.libspark.flartoolkit.core.raster.rgb.IFLARRgbRaster;
          import org.libspark.flartoolkit.core.rasterreader.FLARBufferFormat;
          import org.libspark.flartoolkit.core.rasterreader.IFLARBufferReader;
          import org.libspark.flartoolkit.core.types.FLARIntSize;        
  
          
定数閾値による2値化をする。

  
          public class @ax-student-ar-org-libspark-flartoolkit-core-rasterfilter-rgb2bin-FLARRasterFilter-ARToolkitThreshold implements IFLARRasterFilter_RgbToBin {
  
                  private var _threshold:int;
  
                  public function @ax-student-ar-org-libspark-flartoolkit-core-rasterfilter-rgb2bin-FLARRasterFilter-ARToolkitThreshold(i_threshold:int) {
                          this._threshold = i_threshold;
                  }
  
                  public function setThreshold(i_threshold:int):void {
                          this._threshold = i_threshold;
                  }
  
                  public function doFilter(i_input:IFLARRgbRaster, i_output:IFLARRaster):void {
                          var in_buffer_reader:IFLARBufferReader = i_input.getBufferReader();        
                          var out_buffer_reader:IFLARBufferReader = i_output.getBufferReader();
                          var in_buf_type:int = in_buffer_reader.getBufferType();
  
                          //                assert (out_buffer_reader.isEqualBufferType(IFLARBufferReader.BUFFERFORMAT_INT2D_BIN_8));
                          //                assert (checkInputType(in_buf_type)==true);        
                          //                assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);
  
                          var out_buf:Array = out_buffer_reader.getBuffer() as Array; // int[][]
                          var in_buf:Array = in_buffer_reader.getBuffer() as Array; // byte[] 
  
                          var size:FLARIntSize = i_output.getSize();
                          switch (in_buffer_reader.getBufferType()) {
                                  case FLARBufferFormat.BUFFERFORMAT_BYTE1D_B8G8R8_24:
                                  case FLARBufferFormat.BUFFERFORMAT_BYTE1D_R8G8B8_24:
                                          convert24BitRgb(in_buf, out_buf, size);
                                          break;
                                  case FLARBufferFormat.BUFFERFORMAT_BYTE1D_B8G8R8X8_32:
                                          convert32BitRgbx(in_buf, out_buf, size);
                                          break;
                                  default:
                                          throw new FLARException();
                          }
                          return;
                  }
  
                  

parameter: i_in byte[]
parameter: i_out int[][]

  
                  private function convert24BitRgb(i_in:Array, i_out:Array, i_size:FLARIntSize):void {
                          const size_w:int = i_size.w;
                          const x_mod_end:int = size_w - (size_w % 8);
                          const th:int = this._threshold * 3;
                          var bp:int = (size_w * i_size.h - 1) * 3;        
                          var w:int;
                          var x:int;                
                          for (var y:int = i_size.h - 1; y >= 0; y--) {
                                  //端数分
                                  for (x = size_w - 1; x >= x_mod_end;x--) {
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x] = w <= th ? 0 : 1;
                                          bp -= 3;
                                  }
                                  //タイリング                
                                  for (; x >= 0; x -= 8) {
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x] = w <= th ? 0 : 1;
                                          bp -= 3;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 1] = w <= th ? 0 : 1;
                                          bp -= 3;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 2] = w <= th ? 0 : 1;
                                          bp -= 3;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 3] = w <= th ? 0 : 1;
                                          bp -= 3;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 4] = w <= th ? 0 : 1;
                                          bp -= 3;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 5] = w <= th ? 0 : 1;
                                          bp -= 3;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 6] = w <= th ? 0 : 1;
                                          bp -= 3;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 7] = w <= th ? 0 : 1;
                                          bp -= 3;
                                  }
                          }
                          return;
                  }
  
                  

parameter: i_in byte[]
parameter: i_out int[][]

  
                  private function convert32BitRgbx(i_in:Array, i_out:Array, i_size:FLARIntSize):void {
                          const size_w:int = i_size.w;
                          const x_mod_end:int = size_w - (size_w % 8);
                          const th:int = this._threshold * 3;
                          var bp:int = (size_w * i_size.h - 1) * 4;
                          var w:int;
                          var x:int;
                          for (var y:int = i_size.h - 1; y >= 0; y--) {
                                  //端数分
                                  for (x = size_w - 1; x >= x_mod_end;x--) {
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x] = w <= th ? 0 : 1;
                                          bp -= 4;
                                  }
                                  //タイリング
                                  for (; x >= 0; x -= 8) {
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x] = w <= th ? 0 : 1;
                                          bp -= 4;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 1] = w <= th ? 0 : 1;
                                          bp -= 4;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 2] = w <= th ? 0 : 1;
                                          bp -= 4;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 3] = w <= th ? 0 : 1;
                                          bp -= 4;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 4] = w <= th ? 0 : 1;
                                          bp -= 4;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 5] = w <= th ? 0 : 1;
                                          bp -= 4;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 6] = w <= th ? 0 : 1;
                                          bp -= 4;
                                          w = ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));
                                          i_out[y][x - 7] = w <= th ? 0 : 1;
                                          bp -= 4;
                                  }        
                          }
                          return;
                  }
  
                  private function checkInputType(i_input_type:int):Boolean {
                          switch(i_input_type) {
                                  case FLARBufferFormat.BUFFERFORMAT_BYTE1D_B8G8R8_24:
                                  case FLARBufferFormat.BUFFERFORMAT_BYTE1D_R8G8B8_24:
                                  case FLARBufferFormat.BUFFERFORMAT_BYTE1D_B8G8R8X8_32:
                                          return true;
                                  default:
                                          return false;
                          }
                  }
          }
  }


(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.