OSDN Git Service

[Backup]NyARToolkit for Java
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / nyatla / nyartoolkit / core2 / rasteranalyzer / threshold / NyARRasterThresholdAnalyzer_SlidePTile.java
index 09676da..5b1ef2d 100644 (file)
@@ -44,42 +44,257 @@ import jp.nyatla.nyartoolkit.core.types.*;
  */\r
 public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresholdAnalyzer\r
 {\r
-       private int _persentage;\r
+       interface ICreateHistgramImpl{\r
+               public int createHistgramImpl(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram);\r
+       }\r
+       /**\r
+        * Glayscale(MAX256)のヒストグラム計算クラス\r
+        */\r
+       final class CreateHistgramImpl_INT1D_GRAY_8 implements ICreateHistgramImpl\r
+       {\r
+               public int _v_interval;\r
+               public CreateHistgramImpl_INT1D_GRAY_8(int i_v_interval)\r
+               {\r
+                       this._v_interval=i_v_interval;\r
+                       return;\r
+               }\r
+               public int createHistgramImpl(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram)\r
+               {\r
+                       assert (i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
 \r
-       private int _threshold;\r
+                       int sum=0;\r
+                       final int[] input=(int[]) i_reader.getBuffer();\r
+                       for (int y = i_size.h-1; y >=0 ; y-=this._v_interval){\r
+                               sum+=i_size.w;\r
+                               int pt=y*i_size.w;\r
+                               for (int x = i_size.w-1; x >=0; x--) {\r
+                                       o_histgram[input[pt]]++;\r
+                                       pt++;\r
+                               }\r
+                       }\r
+                       return sum;\r
+               }\r
+       }\r
+       /**\r
+        * RGB24bitのヒストグラム計算クラス\r
+        *\r
+        */\r
+       final class CreateHistgramImpl_BYTE1D_RGB_24 implements ICreateHistgramImpl\r
+       {\r
+               private int _v_interval;\r
+               public CreateHistgramImpl_BYTE1D_RGB_24(int i_v_interval)\r
+               {\r
+                       this._v_interval=i_v_interval;\r
+                       return;\r
+               }\r
+               public int createHistgramImpl(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram)\r
+               {\r
+                       assert (\r
+                               i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24)||\r
+                               i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24));\r
+                       \r
+                       final byte[] input=(byte[]) i_reader.getBuffer();\r
+                       final int pix_count=i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
+                       int sum=0;\r
+                       for (int y = i_size.h-1; y >=0 ; y-=this._v_interval) {\r
+                               sum+=i_size.w;\r
+                               int pt=y*i_size.w*3;\r
+                               int x,v;\r
+                               for (x = pix_count-1; x >=pix_mod_part; x--) {\r
+                                       v=((input[pt+0]& 0xff)+(input[pt+1]& 0xff)+(input[pt+2]& 0xff))/3;\r
+                                       o_histgram[v]++;\r
+                                       pt+=3;\r
+                               }\r
+                               //タイリング\r
+                               for (;x>=0;x-=8){\r
+                                       v=((input[pt+ 0]& 0xff)+(input[pt+ 1]& 0xff)+(input[pt+ 2]& 0xff))/3;\r
+                                       o_histgram[v]++;\r
+                                       v=((input[pt+ 3]& 0xff)+(input[pt+ 4]& 0xff)+(input[pt+ 5]& 0xff))/3;\r
+                                       o_histgram[v]++;\r
+                                       v=((input[pt+ 6]& 0xff)+(input[pt+ 7]& 0xff)+(input[pt+ 8]& 0xff))/3;\r
+                                       o_histgram[v]++;\r
+                                       v=((input[pt+ 9]& 0xff)+(input[pt+10]& 0xff)+(input[pt+11]& 0xff))/3;\r
+                                       o_histgram[v]++;\r
+                                       v=((input[pt+12]& 0xff)+(input[pt+13]& 0xff)+(input[pt+14]& 0xff))/3;\r
+                                       o_histgram[v]++;\r
+                                       v=((input[pt+15]& 0xff)+(input[pt+16]& 0xff)+(input[pt+17]& 0xff))/3;\r
+                                       o_histgram[v]++;\r
+                                       v=((input[pt+18]& 0xff)+(input[pt+19]& 0xff)+(input[pt+20]& 0xff))/3;\r
+                                       o_histgram[v]++;\r
+                                       v=((input[pt+21]& 0xff)+(input[pt+22]& 0xff)+(input[pt+23]& 0xff))/3;\r
+                                       o_histgram[v]++;\r
+                                       pt+=3*8;\r
+                               }\r
+                       }\r
+                       return sum;             \r
+               }\r
+       }\r
+       /**\r
+        * BYTE1D_B8G8R8X8_32のヒストグラム計算クラス\r
+        *\r
+        */     \r
+    final class CreateHistgramImpl_BYTE1D_B8G8R8X8_32 implements ICreateHistgramImpl\r
+    {\r
+        private int _v_interval;\r
+        public CreateHistgramImpl_BYTE1D_B8G8R8X8_32(int i_v_interval)\r
+        {\r
+            this._v_interval = i_v_interval;\r
+            return;\r
+        }\r
+        public int createHistgramImpl(INyARBufferReader i_reader, NyARIntSize i_size, int[] o_histgram)\r
+        {\r
+            assert(i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32));\r
+            byte[] input = (byte[])i_reader.getBuffer();\r
+            int pix_count = i_size.w;\r
+            int pix_mod_part = pix_count - (pix_count % 8);\r
+            int sum = 0;\r
+            for (int y = i_size.h - 1; y >= 0; y -= this._v_interval)\r
+            {\r
+                sum += i_size.w;\r
+                int pt = y * i_size.w * 4;\r
+                int x, v;\r
+                for (x = pix_count - 1; x >= pix_mod_part; x--)\r
+                {\r
+                    v = ((input[pt + 0] & 0xff) + (input[pt + 1] & 0xff) + (input[pt + 2] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4;\r
+                }\r
+                //タイリング\r
+                for (; x >= 0; x -= 8)\r
+                {\r
+                    v = ((input[pt + 0] & 0xff) + (input[pt + 1] & 0xff) + (input[pt + 2] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 4] & 0xff) + (input[pt + 5] & 0xff) + (input[pt + 6] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 8] & 0xff) + (input[pt + 9] & 0xff) + (input[pt + 10] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 12] & 0xff) + (input[pt + 13] & 0xff) + (input[pt + 14] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 16] & 0xff) + (input[pt + 17] & 0xff) + (input[pt + 18] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 20] & 0xff) + (input[pt + 21] & 0xff) + (input[pt + 22] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 24] & 0xff) + (input[pt + 25] & 0xff) + (input[pt + 26] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 28] & 0xff) + (input[pt + 29] & 0xff) + (input[pt + 30] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4 * 8;\r
+                }\r
+            }\r
+            return sum;\r
+        }\r
+    }  \r
+       /**\r
+        * BYTE1D_B8G8R8X8_32のヒストグラム計算クラス\r
+        *\r
+        */     \r
+    final class CreateHistgramImpl_BYTE1D_X8R8G8B8_32 implements ICreateHistgramImpl\r
+    {\r
+        private int _v_interval;\r
+        public CreateHistgramImpl_BYTE1D_X8R8G8B8_32(int i_v_interval)\r
+        {\r
+            this._v_interval = i_v_interval;\r
+            return;\r
+        }\r
+        public int createHistgramImpl(INyARBufferReader i_reader, NyARIntSize i_size, int[] o_histgram)\r
+        {\r
+            assert(i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32));\r
+            byte[] input = (byte[])i_reader.getBuffer();\r
+            int pix_count = i_size.w;\r
+            int pix_mod_part = pix_count - (pix_count % 8);\r
+            int sum = 0;\r
+            for (int y = i_size.h - 1; y >= 0; y -= this._v_interval)\r
+            {\r
+                sum += i_size.w;\r
+                int pt = y * i_size.w * 4;\r
+                int x, v;\r
+                for (x = pix_count - 1; x >= pix_mod_part; x--)\r
+                {\r
+                    v = ((input[pt + 1] & 0xff) + (input[pt + 2] & 0xff) + (input[pt + 3] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4;\r
+                }\r
+                //タイリング\r
+                for (; x >= 0; x -= 8)\r
+                {\r
+                    v = ((input[pt + 1] & 0xff) + (input[pt + 2] & 0xff) + (input[pt + 3] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 5] & 0xff) + (input[pt + 6] & 0xff) + (input[pt + 7] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 9] & 0xff) + (input[pt + 10] & 0xff) + (input[pt + 11] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 13] & 0xff) + (input[pt + 14] & 0xff) + (input[pt + 15] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 17] & 0xff) + (input[pt + 18] & 0xff) + (input[pt + 19] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 21] & 0xff) + (input[pt + 22] & 0xff) + (input[pt + 23] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 25] & 0xff) + (input[pt + 26] & 0xff) + (input[pt + 27] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 29] & 0xff) + (input[pt + 30] & 0xff) + (input[pt + 31] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4 * 8;\r
+                }\r
+            }\r
+            return sum;\r
+        }\r
+    }  \r
 \r
+    private int _persentage;\r
+       private int _threshold;\r
+       private ICreateHistgramImpl _histgram;\r
+       \r
        /**\r
         * @param i_persentage\r
         * 0<=50であること。白/黒マーカーの場合は10~20を推奨 正の場合、黒点を基準にします。 負の場合、白点を基準にします。\r
         * (CMOSカメラの場合、基準点は白点の方が良い)\r
         */\r
-       public NyARRasterThresholdAnalyzer_SlidePTile(int i_persentage)\r
+       public NyARRasterThresholdAnalyzer_SlidePTile(int i_persentage,int i_raster_format,int i_vertical_interval) throws NyARException\r
        {\r
                assert (0 <= i_persentage && i_persentage <= 50);\r
                this._persentage = i_persentage;\r
+        switch (i_raster_format)\r
+        {\r
+            case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
+            case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
+                this._histgram = new CreateHistgramImpl_BYTE1D_RGB_24(i_vertical_interval);\r
+                break;\r
+            case INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8:\r
+                this._histgram = new CreateHistgramImpl_INT1D_GRAY_8(i_vertical_interval);\r
+                break;\r
+            case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32:\r
+                this._histgram = new CreateHistgramImpl_BYTE1D_B8G8R8X8_32(i_vertical_interval);\r
+                break;\r
+               case INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32:\r
+                       this._histgram = new CreateHistgramImpl_BYTE1D_X8R8G8B8_32(i_vertical_interval);\r
+                       break;\r
+            default:\r
+                throw new NyARException();\r
+        }\r
+       }\r
+       public void setVerticalInterval(int i_step)\r
+       {\r
+               return;//未実装一号\r
        }\r
 \r
-       private int createHistgram(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram) throws NyARException\r
+       private int[] _histgram_buf=new int[256];\r
+       public void analyzeRaster(INyARRaster i_input) throws NyARException\r
        {\r
-               int[][] in_buf = (int[][]) i_reader.getBuffer();\r
-               int[] histgram = o_histgram;\r
+               final int[] histgram = this._histgram_buf;\r
+               final NyARIntSize size=i_input.getSize();\r
+               \r
+               //最大画像サイズの制限\r
+               assert size.w*size.h<0x40000000;\r
 \r
-               // ヒストグラムを作成\r
+               //ヒストグラム初期化\r
                for (int i = 0; i < 256; i++) {\r
                        histgram[i] = 0;\r
                }\r
-               int sum = 0;\r
-               for (int y = 0; y < i_size.h; y++) {\r
-                       int sum2 = 0;\r
-                       for (int x = 0; x < i_size.w; x++) {\r
-                               int v = in_buf[y][x];\r
-                               histgram[v]++;\r
-                               sum2 += v;\r
-                       }\r
-                       sum = sum + sum2 / i_size.w;\r
-               }\r
+               int sum_of_pixel=this._histgram.createHistgramImpl(i_input.getBufferReader(), size, histgram);\r
+\r
                // 閾値ピクセル数確定\r
-               int th_pixcels = i_size.w * i_size.h * this._persentage / 100;\r
+               final int th_pixcels = sum_of_pixel * this._persentage / 100;\r
                int th_wk;\r
                int th_w, th_b;\r
 \r
@@ -100,72 +315,9 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
                        }\r
                }\r
                // 閾値の保存\r
-               return (th_w + th_b) / 2;\r
-       }\r
-\r
-       public void analyzeRaster(INyARRaster i_input) throws NyARException\r
-       {\r
-               final INyARBufferReader buffer_reader=i_input.getBufferReader();        \r
-               assert (buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT2D_GLAY_8));\r
-\r
-               int[] histgram = new int[256];\r
-               // 閾値の基準値を出す。\r
-               this._threshold = createHistgram(buffer_reader,i_input.getSize(), histgram);\r
-               return;\r
-       }\r
-\r
-       /**\r
-        * ヒストグラムをラスタに書き出す。\r
-        * \r
-        * @param i_output\r
-        */\r
-       public void debugDrawHistgramMap(INyARRaster i_input, INyARRaster i_output) throws NyARException\r
-       {\r
-               INyARBufferReader in_buffer_reader=i_input.getBufferReader();   \r
-               INyARBufferReader out_buffer_reader=i_output.getBufferReader(); \r
-               assert (in_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT2D_GLAY_8));\r
-               assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT2D_GLAY_8));\r
-\r
-               NyARIntSize size = i_output.getSize();\r
-\r
-               int[][] out_buf = (int[][]) out_buffer_reader.getBuffer();\r
-               // 0で塗りつぶし\r
-               for (int y = 0; y < size.h; y++) {\r
-                       for (int x = 0; x < size.w; x++) {\r
-                               out_buf[y][x] = 0;\r
-                       }\r
-               }\r
-               // ヒストグラムを計算\r
-               int[] histgram = new int[256];\r
-               int threshold = createHistgram(in_buffer_reader,i_input.getSize(), histgram);\r
-               for (int i = 255; i > 0; i--) {\r
-                       histgram[i] = Math.abs(histgram[i]);\r
-               }\r
-\r
-               // ヒストグラムの最大値を出す\r
-               int max_v = 0;\r
-               for (int i = 0; i < 255; i++) {\r
-                       if (max_v < histgram[i]) {\r
-                               max_v = histgram[i];\r
-                       }\r
-               }\r
-               // 目盛り\r
-               for (int i = 0; i < size.h; i++) {\r
-                       out_buf[i][0] = 128;\r
-                       out_buf[i][128] = 128;\r
-                       out_buf[i][255] = 128;\r
-               }\r
-               // スケーリングしながら描画\r
-               for (int i = 0; i < 255; i++) {\r
-                       out_buf[histgram[i] * (size.h - 1) / max_v][i] = 255;\r
-               }\r
-               // 値\r
-               for (int i = 0; i < size.h; i++) {\r
-                       out_buf[i][threshold] = 255;\r
-               }\r
+               this._threshold = (th_w + th_b) / 2;\r
                return;\r
        }\r
-\r
        public int getThreshold()\r
        {\r
                return this._threshold;\r