OSDN Git Service

[tag]NyARToolkit/2.5.1
[nyartoolkit-and/nyartoolkit-and.git] / tags / 2.5.1 / src / jp / nyatla / nyartoolkit / core / rasterfilter / rgb2bin / NyARRasterFilter_ARToolkitThreshold.java
diff --git a/tags/2.5.1/src/jp/nyatla/nyartoolkit/core/rasterfilter/rgb2bin/NyARRasterFilter_ARToolkitThreshold.java b/tags/2.5.1/src/jp/nyatla/nyartoolkit/core/rasterfilter/rgb2bin/NyARRasterFilter_ARToolkitThreshold.java
new file mode 100644 (file)
index 0000000..6b61f86
--- /dev/null
@@ -0,0 +1,371 @@
+package jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.core.raster.rgb.INyARRgbRaster;\r
+import jp.nyatla.nyartoolkit.core.types.NyARBufferType;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
+\r
+\r
+\r
+/**\r
+ * 定数閾値による2値化をする。\r
+ * \r
+ */\r
+public class NyARRasterFilter_ARToolkitThreshold implements INyARRasterFilter_Rgb2Bin\r
+{\r
+       protected int _threshold;\r
+       private IdoThFilterImpl _do_threshold_impl;\r
+\r
+       public NyARRasterFilter_ARToolkitThreshold(int i_threshold,int i_in_raster_type) throws NyARException\r
+       {\r
+               if(!initInstance(i_threshold,i_in_raster_type,NyARBufferType.INT1D_BIN_8)){\r
+                       throw new NyARException();\r
+               }\r
+       }\r
+       public NyARRasterFilter_ARToolkitThreshold(int i_threshold,int i_in_raster_type,int i_out_raster_type) throws NyARException\r
+       {\r
+               if(!initInstance(i_threshold,i_in_raster_type,i_out_raster_type)){\r
+                       throw new NyARException();\r
+               }\r
+       }\r
+       protected boolean initInstance(int i_threshold,int i_in_raster_type,int i_out_raster_type)\r
+       {\r
+               switch(i_out_raster_type){\r
+               case NyARBufferType.INT1D_BIN_8:\r
+                       switch (i_in_raster_type){\r
+                       case NyARBufferType.BYTE1D_B8G8R8_24:\r
+                       case NyARBufferType.BYTE1D_R8G8B8_24:\r
+                               this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_BYTE1D_RGB_24();\r
+                               break;\r
+                       case NyARBufferType.BYTE1D_B8G8R8X8_32:\r
+                               this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_BYTE1D_B8G8R8X8_32();\r
+                               break;\r
+                       case NyARBufferType.BYTE1D_X8R8G8B8_32:\r
+                               this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_BYTE1D_X8R8G8B8_32();\r
+                               break;\r
+                       case NyARBufferType.INT1D_X8R8G8B8_32:\r
+                               this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_INT1D_X8R8G8B8_32();\r
+                               break;\r
+                       case NyARBufferType.WORD1D_R5G6B5_16LE:\r
+                               this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_WORD1D_R5G6B5_16LE();\r
+                               break;\r
+                       default:\r
+                               return false;//サポートしない組み合わせ\r
+                       }\r
+                       break;\r
+               default:\r
+                       return false;//サポートしない組み合わせ\r
+               }\r
+               this._threshold = i_threshold;\r
+               return true;\r
+       }       \r
+       \r
+       /**\r
+        * 画像を2値化するための閾値。暗点<=th<明点となります。\r
+        * @param i_threshold\r
+        */\r
+       public void setThreshold(int i_threshold)\r
+       {\r
+               this._threshold = i_threshold;\r
+       }\r
+\r
+       public void doFilter(INyARRgbRaster i_input, NyARBinRaster i_output) throws NyARException\r
+       {\r
+\r
+               assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
+               this._do_threshold_impl.doThFilter(i_input,i_output,i_output.getSize(), this._threshold);\r
+               return;\r
+       }\r
+       /*\r
+        * ここから各ラスタ用のフィルタ実装\r
+        */\r
+       interface IdoThFilterImpl\r
+       {\r
+               public void doThFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size,int i_threshold);\r
+       }\r
+       class doThFilterImpl_BUFFERFORMAT_BYTE1D_RGB_24 implements IdoThFilterImpl\r
+       {\r
+               public void doThFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size,int i_threshold)\r
+               {\r
+                       assert (i_output.isEqualBufferType(NyARBufferType.INT1D_BIN_8));\r
+                       \r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       byte[] in_buf = (byte[]) i_input.getBuffer();\r
+                       \r
+                       final int th=i_threshold*3;\r
+                       int bp =(i_size.w*i_size.h-1)*3;\r
+                       int w;\r
+                       int xy;\r
+                       final int pix_count   =i_size.h*i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
+                       for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                       }\r
+                       //タイリング\r
+                       for (;xy>=0;) {\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                       }\r
+                       return;                 \r
+               }\r
+               \r
+       }\r
+       class doThFilterImpl_BUFFERFORMAT_BYTE1D_B8G8R8X8_32 implements IdoThFilterImpl\r
+       {\r
+               public void doThFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size,int i_threshold)\r
+               {\r
+                       assert (i_input.isEqualBufferType(NyARBufferType.BYTE1D_B8G8R8X8_32));\r
+                       assert (i_output.isEqualBufferType(NyARBufferType.INT1D_BIN_8));\r
+                       \r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       byte[] in_buf = (byte[]) i_input.getBuffer();\r
+                       \r
+                       final int th=i_threshold*3;\r
+                       int bp =(i_size.w*i_size.h-1)*4;\r
+                       int w;\r
+                       int xy;\r
+                       final int pix_count   =i_size.h*i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
+                       for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                       }\r
+                       //タイリング\r
+                       for (;xy>=0;) {\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                       }                       \r
+               }               \r
+       }\r
+       \r
+       class doThFilterImpl_BUFFERFORMAT_BYTE1D_X8R8G8B8_32 implements IdoThFilterImpl\r
+       {\r
+               public void doThFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size,int i_threshold)\r
+               {\r
+                       assert (i_output.isEqualBufferType(NyARBufferType.INT1D_BIN_8));\r
+                       \r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       byte[] in_buf = (byte[]) i_input.getBuffer();\r
+                       \r
+                       final int th=i_threshold*3;\r
+                       int bp =(i_size.w*i_size.h-1)*4;\r
+                       int w;\r
+                       int xy;\r
+                       final int pix_count   =i_size.h*i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
+                       for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                       }\r
+                       //タイリング\r
+                       for (;xy>=0;) {\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                       }\r
+                       return;                 \r
+               }\r
+               \r
+       }       \r
+       \r
+       class doThFilterImpl_BUFFERFORMAT_INT1D_X8R8G8B8_32 implements IdoThFilterImpl\r
+       {\r
+               public void doThFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size,int i_threshold)\r
+               {\r
+                       assert (i_output.isEqualBufferType(NyARBufferType.INT1D_BIN_8));\r
+                       \r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       int[] in_buf = (int[]) i_input.getBuffer();\r
+                       \r
+                       final int th=i_threshold*3;\r
+                       int w;\r
+                       int xy;\r
+                       final int pix_count   =i_size.h*i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
+\r
+                       for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                       }\r
+                       //タイリング\r
+                       for (;xy>=0;) {\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                       }                       \r
+               }               \r
+       }\r
+       \r
+       class doThFilterImpl_BUFFERFORMAT_WORD1D_R5G6B5_16LE implements IdoThFilterImpl\r
+       {\r
+               public void doThFilter(INyARRaster i_input, INyARRaster i_output,NyARIntSize i_size,int i_threshold)\r
+               {\r
+                       assert (i_output.isEqualBufferType(NyARBufferType.INT1D_BIN_8));\r
+                       \r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       short[] in_buf = (short[]) i_input.getBuffer();\r
+                       \r
+                       final int th=i_threshold*3;\r
+                       int w;\r
+                       int xy;\r
+                       final int pix_count   =i_size.h*i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
+\r
+                       for(xy=pix_count-1;xy>=pix_mod_part;xy--){                              \r
+                w =(int)in_buf[xy];\r
+                w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
+                out_buf[xy] = w <= th ? 0 : 1;\r
+                       }\r
+                       //タイリング\r
+                       for (;xy>=0;) {\r
+                w =(int)in_buf[xy];\r
+                w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
+                out_buf[xy] = w <= th ? 0 : 1;\r
+                               xy--;\r
+                w =(int)in_buf[xy];\r
+                w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
+                out_buf[xy] = w <= th ? 0 : 1;\r
+                               xy--;\r
+                w =(int)in_buf[xy];\r
+                w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
+                out_buf[xy] = w <= th ? 0 : 1;\r
+                               xy--;\r
+                w =(int)in_buf[xy];\r
+                w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
+                out_buf[xy] = w <= th ? 0 : 1;\r
+                               xy--;\r
+                w =(int)in_buf[xy];\r
+                w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
+                out_buf[xy] = w <= th ? 0 : 1;\r
+                               xy--;\r
+                w =(int)in_buf[xy];\r
+                w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
+                out_buf[xy] = w <= th ? 0 : 1;\r
+                               xy--;\r
+                w =(int)in_buf[xy];\r
+                w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
+                out_buf[xy] = w <= th ? 0 : 1;\r
+                               xy--;\r
+                w =(int)in_buf[xy];\r
+                w = ((w & 0xf800) >> 8) + ((w & 0x07e0) >> 3) + ((w & 0x001f) << 3);\r
+                out_buf[xy] = w <= th ? 0 : 1;\r
+                               xy--;\r
+                       }\r
+               }               \r
+       }       \r
+}\r