OSDN Git Service

[リリース]NyARToolkit 1.2.0
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Sat, 7 Jun 2008 03:14:40 +0000 (03:14 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Sat, 7 Jun 2008 03:14:40 +0000 (03:14 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit@82 7cac0a50-4618-4814-88d0-24b83990f816

25 files changed:
trunk/Data/patt.kanji [new file with mode: 0644]
trunk/Data/pattKanji.pdf [new file with mode: 0644]
trunk/readme.ja.txt
trunk/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/J3dNyARRaster_RGB.java
trunk/sample/java3d/src/jp/nyatla/nyartoolkit/java3d/utils/NyARSingleMarkerBehaviorHolder.java
trunk/sample/jmf/jp/nyatla/nyartoolkit/jmf/sample/NyarToolkitLinkTest.java
trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JavaSimpleLite.java
trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JavaSimpleLite2.java [new file with mode: 0644]
trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/utils/GLNyARDetectMarker.java [new file with mode: 0644]
trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/utils/GLNyARSingleDetectMarker.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARColorPatt.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARColorPatt_O1.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARColorPatt_O2.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARColorPatt_O3.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARMat.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARParam.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARTransMat.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARTransMatResult.java [new file with mode: 0644]
trunk/src/jp/nyatla/nyartoolkit/core/NyARTransMat_O1.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARTransMat_O2.java
trunk/src/jp/nyatla/nyartoolkit/core/NyARTransRot.java
trunk/src/jp/nyatla/nyartoolkit/detector/NyARDetectMarker.java [new file with mode: 0644]
trunk/src/jp/nyatla/nyartoolkit/detector/NyARSingleDetectMarker.java
trunk/src/jp/nyatla/nyartoolkit/sample/RawFileTest.java
trunk/src/jp/nyatla/util/DoublePointer.java

diff --git a/trunk/Data/patt.kanji b/trunk/Data/patt.kanji
new file mode 100644 (file)
index 0000000..87d32bb
--- /dev/null
@@ -0,0 +1,196 @@
+ 214 225 240 225 214 240 216 204 214 227 181 192 198 192 181 192
+ 240 240 240 240 240 240 225 232 240 240 240 240 240 240 240 236
+ 240 240 240 240 240 240  75 128 220 240 240 240 240 240 240 240
+ 240 240 240 240 240 240 106  53 240 240 240 240 240 240 240 237
+ 240 240 240 240 240 238 118  31 240 240 240 240 240 240 240 234
+ 240 240 240 240 240 240  74  49 207 240 240 240 240 240 240 240
+ 240 240 240 240 240 240  53  54 177 240 240 240 240 240 240 240
+ 240 240 240 240 240 240  64  31 130 240 240 240 240 240 240 219
+ 240 240 240 240 240 180  37  57  78 228 240 240 240 240 240 240
+ 240 240 240 240 240 118  62 157  36 185 240 240 240 240 240 231
+ 240 240 240 240 240  82  65 225  67  80 230 240 240 240 240 217
+ 240 240 240 225  53  76 225 240 156  62 158 240 240 240 240 226
+ 240 240 199  61   9 111 235 240 240 104  58 174 228 240 240 240
+ 240 142  64  26  92 227 240 240 240 229  93  64 170 226 238 216
+  90  26  12 156 240 240 240 240 240 240 204  95  30 117 192 200
+ 156  16 195 233 235 240 236 240 238 239 240 186  93  53 120 237
+ 214 226 240 225 212 240 216 204 212 226 181 192 198 192 185 194
+ 240 240 240 240 240 240 227 232 240 240 240 240 240 240 240 238
+ 240 240 240 240 240 240  95 138 225 240 240 240 240 240 240 240
+ 240 240 240 240 240 240 108  59 240 240 240 240 240 240 240 237
+ 240 240 240 240 240 238 118  31 240 240 240 240 240 240 240 234
+ 240 240 240 240 240 240  83  47 207 240 240 240 240 240 240 240
+ 240 240 240 240 240 240  56  49 177 240 240 240 240 240 240 240
+ 240 240 240 240 240 240  73  41 130 240 240 240 240 240 240 222
+ 240 240 240 240 240 185  46  49  86 230 240 240 240 240 240 240
+ 240 240 240 240 240 118  58 165  45 192 240 240 240 240 240 234
+ 240 240 240 240 240  91  63 222  74  82 240 240 240 240 240 222
+ 240 240 240 226  66  86 225 240 158  63 162 240 240 240 240 228
+ 240 240 202  76  11 103 235 240 234  91  49 174 228 240 240 240
+ 240 142  68  16  91 226 240 240 240 228  96  74 178 233 239 222
+  90  26   4 150 240 240 240 240 240 240 213 109  46 133 204 213
+ 156  14 195 234 236 240 237 240 239 240 240 192 106  57 125 238
+ 214 226 240 225 212 240 216 204 214 227 181 192 198 192 184 192
+ 240 240 240 240 240 240 226 232 240 240 240 240 240 240 240 236
+ 240 240 240 240 240 240  85 134 220 240 240 240 240 240 240 240
+ 240 240 240 240 240 240 107  58 240 240 240 240 240 240 240 237
+ 240 240 240 240 240 238 118  32 240 240 240 240 240 240 240 234
+ 240 240 240 240 240 240  87  60 210 240 240 240 240 240 240 240
+ 240 240 240 240 240 240  58  58 178 240 240 240 240 240 240 240
+ 240 240 240 240 240 240  73  31 130 240 240 240 240 240 240 219
+ 240 240 240 240 240 185  46  59  86 228 240 240 240 240 240 240
+ 240 240 240 240 240 118  62 168  41 186 240 240 240 240 240 231
+ 240 240 240 240 240  90  65 225  60  92 235 240 240 240 240 219
+ 240 240 240 225  53  82 225 240 146  63 163 240 240 240 240 228
+ 240 240 198  61   5 103 235 240 234 102  58 175 232 240 240 240
+ 240 134  54  13  91 226 240 240 240 229  96  68 188 238 239 222
+  90  15   3 150 240 240 240 240 240 240 213 105  48 134 204 213
+ 156  14 195 233 236 240 237 240 239 239 240 192 106  57 125 238
+
+ 192 236 240 237 234 240 240 219 240 231 217 226 240 216 200 237
+ 181 240 240 240 240 240 240 240 240 240 240 240 240 238 192 120
+ 192 240 240 240 240 240 240 240 240 240 240 240 240 226 117  53
+ 198 240 240 240 240 240 240 240 240 240 240 240 228 170  30  93
+ 192 240 240 240 240 240 240 240 240 240 240 240 174  64  95 186
+ 181 240 240 240 240 240 240 240 240 240 230 158  58  93 204 240
+ 227 240 240 240 240 240 240 240 228 185  80  62 104 229 240 239
+ 214 240 220 240 240 207 177 130  78  36  67 156 240 240 240 238
+ 204 232 128  53  31  49  54  31  57 157 225 240 240 240 240 240
+ 216 225  75 106 118  74  53  64  37  62  65 225 235 240 240 236
+ 240 240 240 240 238 240 240 240 180 118  82  76 111 227 240 240
+ 214 240 240 240 240 240 240 240 240 240 240  53   9  92 240 235
+ 225 240 240 240 240 240 240 240 240 240 240 225  61  26 156 233
+ 240 240 240 240 240 240 240 240 240 240 240 240 199  64  12 195
+ 225 240 240 240 240 240 240 240 240 240 240 240 240 142  26  16
+ 214 240 240 240 240 240 240 240 240 240 240 240 240 240  90 156
+ 194 238 240 237 234 240 240 222 240 234 222 228 240 222 213 238
+ 185 240 240 240 240 240 240 240 240 240 240 240 240 239 204 125
+ 192 240 240 240 240 240 240 240 240 240 240 240 240 233 133  57
+ 198 240 240 240 240 240 240 240 240 240 240 240 228 178  46 106
+ 192 240 240 240 240 240 240 240 240 240 240 240 174  74 109 192
+ 181 240 240 240 240 240 240 240 240 240 240 162  49  96 213 240
+ 226 240 240 240 240 240 240 240 230 192  82  63  91 228 240 240
+ 212 240 225 240 240 207 177 130  86  45  74 158 234 240 240 239
+ 204 232 138  59  31  47  49  41  49 165 222 240 240 240 240 240
+ 216 227  95 108 118  83  56  73  46  58  63 225 235 240 240 237
+ 240 240 240 240 238 240 240 240 185 118  91  86 103 226 240 240
+ 212 240 240 240 240 240 240 240 240 240 240  66  11  91 240 236
+ 225 240 240 240 240 240 240 240 240 240 240 226  76  16 150 234
+ 240 240 240 240 240 240 240 240 240 240 240 240 202  68   4 195
+ 226 240 240 240 240 240 240 240 240 240 240 240 240 142  26  14
+ 214 240 240 240 240 240 240 240 240 240 240 240 240 240  90 156
+ 192 236 240 237 234 240 240 219 240 231 219 228 240 222 213 238
+ 184 240 240 240 240 240 240 240 240 240 240 240 240 239 204 125
+ 192 240 240 240 240 240 240 240 240 240 240 240 240 238 134  57
+ 198 240 240 240 240 240 240 240 240 240 240 240 232 188  48 106
+ 192 240 240 240 240 240 240 240 240 240 240 240 175  68 105 192
+ 181 240 240 240 240 240 240 240 240 240 235 163  58  96 213 240
+ 227 240 240 240 240 240 240 240 228 186  92  63 102 229 240 239
+ 214 240 220 240 240 210 178 130  86  41  60 146 234 240 240 239
+ 204 232 134  58  32  60  58  31  59 168 225 240 240 240 240 240
+ 216 226  85 107 118  87  58  73  46  62  65 225 235 240 240 237
+ 240 240 240 240 238 240 240 240 185 118  90  82 103 226 240 240
+ 212 240 240 240 240 240 240 240 240 240 240  53   5  91 240 236
+ 225 240 240 240 240 240 240 240 240 240 240 225  61  13 150 233
+ 240 240 240 240 240 240 240 240 240 240 240 240 198  54   3 195
+ 226 240 240 240 240 240 240 240 240 240 240 240 240 134  15  14
+ 214 240 240 240 240 240 240 240 240 240 240 240 240 240  90 156
+
+ 237 120  53  93 186 240 239 238 240 236 240 235 233 195  16 156
+ 200 192 117  30  95 204 240 240 240 240 240 240 156  12  26  90
+ 216 238 226 170  64  93 229 240 240 240 227  92  26  64 142 240
+ 240 240 240 228 174  58 104 240 240 235 111   9  61 199 240 240
+ 226 240 240 240 240 158  62 156 240 225  76  53 225 240 240 240
+ 217 240 240 240 240 230  80  67 225  65  82 240 240 240 240 240
+ 231 240 240 240 240 240 185  36 157  62 118 240 240 240 240 240
+ 240 240 240 240 240 240 228  78  57  37 180 240 240 240 240 240
+ 219 240 240 240 240 240 240 130  31  64 240 240 240 240 240 240
+ 240 240 240 240 240 240 240 177  54  53 240 240 240 240 240 240
+ 240 240 240 240 240 240 240 207  49  74 240 240 240 240 240 240
+ 234 240 240 240 240 240 240 240  31 118 238 240 240 240 240 240
+ 237 240 240 240 240 240 240 240  53 106 240 240 240 240 240 240
+ 240 240 240 240 240 240 240 220 128  75 240 240 240 240 240 240
+ 236 240 240 240 240 240 240 240 232 225 240 240 240 240 240 240
+ 192 181 192 198 192 181 227 214 204 216 240 214 225 240 225 214
+ 238 125  57 106 192 240 240 239 240 237 240 236 234 195  14 156
+ 213 204 133  46 109 213 240 240 240 240 240 240 150   4  26  90
+ 222 239 233 178  74  96 228 240 240 240 226  91  16  68 142 240
+ 240 240 240 228 174  49  91 234 240 235 103  11  76 202 240 240
+ 228 240 240 240 240 162  63 158 240 225  86  66 226 240 240 240
+ 222 240 240 240 240 240  82  74 222  63  91 240 240 240 240 240
+ 234 240 240 240 240 240 192  45 165  58 118 240 240 240 240 240
+ 240 240 240 240 240 240 230  86  49  46 185 240 240 240 240 240
+ 222 240 240 240 240 240 240 130  41  73 240 240 240 240 240 240
+ 240 240 240 240 240 240 240 177  49  56 240 240 240 240 240 240
+ 240 240 240 240 240 240 240 207  47  83 240 240 240 240 240 240
+ 234 240 240 240 240 240 240 240  31 118 238 240 240 240 240 240
+ 237 240 240 240 240 240 240 240  59 108 240 240 240 240 240 240
+ 240 240 240 240 240 240 240 225 138  95 240 240 240 240 240 240
+ 238 240 240 240 240 240 240 240 232 227 240 240 240 240 240 240
+ 194 185 192 198 192 181 226 212 204 216 240 212 225 240 226 214
+ 238 125  57 106 192 240 239 239 240 237 240 236 233 195  14 156
+ 213 204 134  48 105 213 240 240 240 240 240 240 150   3  15  90
+ 222 239 238 188  68  96 229 240 240 240 226  91  13  54 134 240
+ 240 240 240 232 175  58 102 234 240 235 103   5  61 198 240 240
+ 228 240 240 240 240 163  63 146 240 225  82  53 225 240 240 240
+ 219 240 240 240 240 235  92  60 225  65  90 240 240 240 240 240
+ 231 240 240 240 240 240 186  41 168  62 118 240 240 240 240 240
+ 240 240 240 240 240 240 228  86  59  46 185 240 240 240 240 240
+ 219 240 240 240 240 240 240 130  31  73 240 240 240 240 240 240
+ 240 240 240 240 240 240 240 178  58  58 240 240 240 240 240 240
+ 240 240 240 240 240 240 240 210  60  87 240 240 240 240 240 240
+ 234 240 240 240 240 240 240 240  32 118 238 240 240 240 240 240
+ 237 240 240 240 240 240 240 240  58 107 240 240 240 240 240 240
+ 240 240 240 240 240 240 240 220 134  85 240 240 240 240 240 240
+ 236 240 240 240 240 240 240 240 232 226 240 240 240 240 240 240
+ 192 184 192 198 192 181 227 214 204 216 240 212 225 240 226 214
+
+ 156  90 240 240 240 240 240 240 240 240 240 240 240 240 240 214
+  16  26 142 240 240 240 240 240 240 240 240 240 240 240 240 225
+ 195  12  64 199 240 240 240 240 240 240 240 240 240 240 240 240
+ 233 156  26  61 225 240 240 240 240 240 240 240 240 240 240 225
+ 235 240  92   9  53 240 240 240 240 240 240 240 240 240 240 214
+ 240 240 227 111  76  82 118 180 240 240 240 238 240 240 240 240
+ 236 240 240 235 225  65  62  37  64  53  74 118 106  75 225 216
+ 240 240 240 240 240 225 157  57  31  54  49  31  53 128 232 204
+ 238 240 240 240 156  67  36  78 130 177 207 240 240 220 240 214
+ 239 240 229 104  62  80 185 228 240 240 240 240 240 240 240 227
+ 240 204  93  58 158 230 240 240 240 240 240 240 240 240 240 181
+ 186  95  64 174 240 240 240 240 240 240 240 240 240 240 240 192
+  93  30 170 228 240 240 240 240 240 240 240 240 240 240 240 198
+  53 117 226 240 240 240 240 240 240 240 240 240 240 240 240 192
+ 120 192 238 240 240 240 240 240 240 240 240 240 240 240 240 181
+ 237 200 216 240 226 217 231 240 219 240 240 234 237 240 236 192
+ 156  90 240 240 240 240 240 240 240 240 240 240 240 240 240 214
+  14  26 142 240 240 240 240 240 240 240 240 240 240 240 240 226
+ 195   4  68 202 240 240 240 240 240 240 240 240 240 240 240 240
+ 234 150  16  76 226 240 240 240 240 240 240 240 240 240 240 225
+ 236 240  91  11  66 240 240 240 240 240 240 240 240 240 240 212
+ 240 240 226 103  86  91 118 185 240 240 240 238 240 240 240 240
+ 237 240 240 235 225  63  58  46  73  56  83 118 108  95 227 216
+ 240 240 240 240 240 222 165  49  41  49  47  31  59 138 232 204
+ 239 240 240 234 158  74  45  86 130 177 207 240 240 225 240 212
+ 240 240 228  91  63  82 192 230 240 240 240 240 240 240 240 226
+ 240 213  96  49 162 240 240 240 240 240 240 240 240 240 240 181
+ 192 109  74 174 240 240 240 240 240 240 240 240 240 240 240 192
+ 106  46 178 228 240 240 240 240 240 240 240 240 240 240 240 198
+  57 133 233 240 240 240 240 240 240 240 240 240 240 240 240 192
+ 125 204 239 240 240 240 240 240 240 240 240 240 240 240 240 185
+ 238 213 222 240 228 222 234 240 222 240 240 234 237 240 238 194
+ 156  90 240 240 240 240 240 240 240 240 240 240 240 240 240 214
+  14  15 134 240 240 240 240 240 240 240 240 240 240 240 240 226
+ 195   3  54 198 240 240 240 240 240 240 240 240 240 240 240 240
+ 233 150  13  61 225 240 240 240 240 240 240 240 240 240 240 225
+ 236 240  91   5  53 240 240 240 240 240 240 240 240 240 240 212
+ 240 240 226 103  82  90 118 185 240 240 240 238 240 240 240 240
+ 237 240 240 235 225  65  62  46  73  58  87 118 107  85 226 216
+ 240 240 240 240 240 225 168  59  31  58  60  32  58 134 232 204
+ 239 240 240 234 146  60  41  86 130 178 210 240 240 220 240 214
+ 239 240 229 102  63  92 186 228 240 240 240 240 240 240 240 227
+ 240 213  96  58 163 235 240 240 240 240 240 240 240 240 240 181
+ 192 105  68 175 240 240 240 240 240 240 240 240 240 240 240 192
+ 106  48 188 232 240 240 240 240 240 240 240 240 240 240 240 198
+  57 134 238 240 240 240 240 240 240 240 240 240 240 240 240 192
+ 125 204 239 240 240 240 240 240 240 240 240 240 240 240 240 184
+ 238 213 222 240 228 219 231 240 219 240 240 234 237 240 236 192
+
diff --git a/trunk/Data/pattKanji.pdf b/trunk/Data/pattKanji.pdf
new file mode 100644 (file)
index 0000000..550c721
Binary files /dev/null and b/trunk/Data/pattKanji.pdf differ
index e9fb7a4..d626b5e 100644 (file)
@@ -1,7 +1,7 @@
-ARToolkit Java class library NyARToolkit.\r
+ARToolkit Java class library NyARToolkit.\r
 Copyright (C)2008 R.Iizuka\r
 \r
-version 1.1.1.20080503.0\r
+version 1.2.0.20080511\r
 \r
 http://nyatla.jp/\r
 airmail(at)ebony.plala.or.jp\r
@@ -81,8 +81,11 @@ NyARToolkitのアプリケーションサンプルEclipseプロジェクトが
   ビデオキャプチャの試験プログラム と、マーカー検出プログラムがあります。\r
 \r
  jogl\r
-  jp.nyatla.nyartoolkit.jogl.sample\r
-  ARToolkitのsimpleLite相当のサンプルがあります。\r
+  jp.nyatla.nyartoolkit.jogl.sample.JavaSimpleLite\r
+  単一のマーカーを認識するARToolkitのsimpleLite相当のサンプルです。\r
+  jp.nyatla.nyartoolkit.jogl.sample.JavaSimpleLite2\r
+  複数のマーカーを認識するサンプルです。~100個程度のマーカーを同時に\r
+  認識します。\r
 \r
  java3d\r
   jp.nyatla.nyartoolkit.java3d.sample\r
@@ -112,26 +115,23 @@ sampleディレクトリ以下にあるソースはAPIは仕様が固まって
 クラスは関数機能毎にまとめた作りになっていますので、オリジナルの\r
 コード読んだことがあれば、なんとなく判ると思います。\r
 \r
-æ¼\94ç®\97æ\80§è\83½ã\81¯ã\80\81Windowsç\92°å¢\83ä¸\8bã\81§VCã\83ªã\83ªã\83¼ã\82¹ç\89\88ã\81®ç´\84101.5ï¼\85です。\r
+æ¼\94ç®\97æ\80§è\83½ã\81¯ã\80\81Windowsç\92°å¢\83ä¸\8bã\81§VCã\83ªã\83ªã\83¼ã\82¹ç\89\88ã\81¨ã\81»ã\81¼å\90\8cã\81\98です。\r
 マーカー認識部分はネイティブ版よりも低速ですが、変換行列計算部分\r
-はネイティブ版よりも圧倒的に高速に動作します。\r
+はネイティブ版よりも高速に動作します。\r
+このため、複数マーカー取り扱い時は、ネイティブ版よりも良い成績が得られます。\r
 \r
 \r
 ・足りない機能等\r
 \r
\83\9eã\83¼ã\82«ã\83¼ã\81®ã\82»ã\83¼ã\83\96æ©\9fè\83½ã\81¨ã\80\81è¤\87æ\95°ã\83\9eã\83¼ã\82«ã\83¼ã\81®èª\8dè­\98æ©\9fè\83½ã\81\8cæ\9cªå®\9fè£\85ã\81§ã\81\99\r
\82«ã\83¡ã\83©ã\82­ã\83£ã\83ªã\83\96ã\83¬ã\83¼ã\82·ã\83§ã\83³ã\80\81ã\83\9eã\83¼ã\82«ã\83¼ã\81®ã\82»ã\83¼ã\83\96æ©\9fè\83½ç­\89ã\81\8cã\81\82ã\82\8aã\81¾ã\81\9bã\82\93\r
 \r
 今後実装していきます。\r
 \r
 \r
-\r
-\r
 ・ライセンス\r
 GPLです。詳しくはLICENCE.txtをみてください。\r
 \r
 \r
-\r
-\r
 ・お願い\r
 NyARToolkitを使って面白いものが出来たら、是非教えてください。\r
 \r
@@ -142,4 +142,4 @@ NyARToolkitを使って面白いものが出来たら、是非教えてくださ
 \r
 ではでは、楽しく遊んでくださいネ。\r
 \r
-2008.05.03 R.Iizuka A虎@nyatla.jp\r
+2008.05.11 R.Iizuka A虎@nyatla.jp\r
index 1974a57..a508bf0 100644 (file)
@@ -20,7 +20,6 @@ import jp.nyatla.nyartoolkit.jmf.utils.*;
 \r
 /**\r
  * \r
- * @author A虎@\r
  * このクラスは、Java3Dと互換性のあるNyARToolkitのラスタイメージを保持します。\r
  *\r
  */\r
index 56ed926..5bfb073 100644 (file)
@@ -13,6 +13,7 @@ import javax.media.j3d.*;
 import javax.vecmath.*;\r
 \r
 import jp.nyatla.nyartoolkit.core.NyARParam;\r
+import jp.nyatla.nyartoolkit.core.NyARTransMatResult;\r
 import jp.nyatla.nyartoolkit.detector.NyARSingleDetectMarker;\r
 import jp.nyatla.nyartoolkit.jmf.*;\r
 import jp.nyatla.nyartoolkit.jmf.utils.JmfCameraCapture;\r
@@ -103,6 +104,7 @@ public class NyARSingleMarkerBehaviorHolder implements JmfCaptureListener
 \r
 class NyARBehavior extends Behavior\r
 {\r
+    private NyARTransMatResult trans_mat_result=new NyARTransMatResult();    \r
     private NyARSingleDetectMarker related_nya;\r
     private TransformGroup trgroup;\r
     private Background back_ground;\r
@@ -163,8 +165,8 @@ class NyARBehavior extends Behavior
                 if(raster.hasData()){\r
                     is_marker_exist=related_nya.detectMarkerLite(raster, 100);\r
                     if(is_marker_exist){\r
-                        NyARMat nymat=related_nya.getTransmationMatrix();\r
-                        double[][] src=nymat.getArray();\r
+                        related_nya.getTransmationMatrix(this.trans_mat_result);\r
+                        double[][] src=this.trans_mat_result.getArray();\r
                         Matrix4d matrix=new Matrix4d(\r
                              src[0][0],-src[1][0],-src[2][0],0,\r
                             -src[0][1], src[1][1], src[2][1],0,\r
index e87b993..e1f5dac 100644 (file)
@@ -30,9 +30,10 @@ public class NyarToolkitLinkTest extends Frame implements JmfCaptureListener
     private final String CARCODE_FILE ="../../Data/patt.hiro";
     private final String PARAM_FILE   ="../../Data/camera_para.dat";
     private JmfCameraCapture capture;
-    NyARSingleDetectMarker nya;
-    JmfNyARRaster_RGB raster;
-
+    private NyARSingleDetectMarker nya;
+    private JmfNyARRaster_RGB raster;
+    private NyARTransMatResult trans_mat_result=new NyARTransMatResult();
+    
     public NyarToolkitLinkTest() throws NyARException,NyARException
     {
         setTitle("JmfCaptureTest");
@@ -53,7 +54,7 @@ public class NyarToolkitLinkTest extends Frame implements JmfCaptureListener
     }
 
 
-
+    
     public void onUpdateBuffer(Buffer i_buffer)
     {
        try{
@@ -71,7 +72,8 @@ public class NyarToolkitLinkTest extends Frame implements JmfCaptureListener
             boolean is_marker_exist=nya.detectMarkerLite(raster,100);
             if(is_marker_exist){
                 //変換行列を取得
-                atm=nya.getTransmationMatrix().getArray();
+                nya.getTransmationMatrix(this.trans_mat_result);
+                atm=this.trans_mat_result.getArray();
             }
             //情報を画面に書く       
             g.drawImage(img, 32, 32,this);
index 5f1503f..cb731a2 100644 (file)
@@ -1,7 +1,6 @@
 /**\r
  * simpleLiteと同じようなテストプログラム\r
- * マーカーの一致度の最低値をチェックするところを抜いたので、同じマーカーを大量に\r
- * 検出すると面白いことになります。\r
+ * 最も一致する"Hiro"マーカーを一つ選択して、その上に立方体を表示します。\r
  * (c)2008 A虎@nyatla.jp\r
  * airmail(at)ebony.plala.or.jp\r
  * http://nyatla.jp/\r
@@ -135,6 +134,7 @@ public class JavaSimpleLite implements GLEventListener,JmfCaptureListener
             ar_param.loadFromARFile(PARAM_FILE);\r
             ar_param.changeSize(SCREEN_X,SCREEN_Y);\r
             nya=new GLNyARSingleDetectMarker(ar_param,ar_code,80.0);\r
+            nya.setContinueMode(true);//ここをtrueにすると、transMatContinueモード(History計算)になります。\r
             ar_code.loadFromARFile(CARCODE_FILE);\r
             //NyARToolkit用の支援クラス\r
             glnya=new NyARGLUtil(gl,ar_param);\r
@@ -177,7 +177,7 @@ public class JavaSimpleLite implements GLEventListener,JmfCaptureListener
             //画像チェックしてマーカー探して、背景を書く\r
             boolean is_marker_exist;\r
             synchronized(cap_image){\r
-               is_marker_exist=nya.detectMarkerLite(cap_image,100);\r
+               is_marker_exist=nya.detectMarkerLite(cap_image,110);\r
                //背景を書く\r
                glnya.drawBackGround(cap_image, 1.0);\r
             }\r
@@ -196,9 +196,11 @@ public class JavaSimpleLite implements GLEventListener,JmfCaptureListener
                 // All other lighting and geometry goes here.\r
                 drawCube();\r
             }\r
+            Thread.sleep(1);//タスク実行権限を一旦渡す\r
         }catch(Exception e){\r
             e.printStackTrace();\r
         }\r
+        \r
     }\r
     public void onUpdateBuffer(Buffer i_buffer)\r
     {\r
diff --git a/trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JavaSimpleLite2.java b/trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JavaSimpleLite2.java
new file mode 100644 (file)
index 0000000..5e777ff
--- /dev/null
@@ -0,0 +1,237 @@
+/**\r
+ * simpleLiteの複数マーカー同時認識バージョン\r
+ * "Hiro"のマーカーと"人"のマーカーの混在環境で、Hiroのマーカー全てに\r
+ * 立方体を表示します。\r
+ * (c)2008 A虎@nyatla.jp\r
+ * airmail(at)ebony.plala.or.jp\r
+ * http://nyatla.jp/\r
+ */\r
+package jp.nyatla.nyartoolkit.jogl.sample;\r
+\r
+import java.awt.event.WindowAdapter;\r
+import java.awt.event.WindowEvent;\r
+import java.awt.*;\r
+\r
+import javax.media.Buffer;\r
+\r
+import javax.media.opengl.GL;\r
+import javax.media.opengl.GLAutoDrawable;\r
+import javax.media.opengl.GLEventListener;\r
+import javax.media.opengl.GLCanvas;\r
+\r
+import com.sun.opengl.util.Animator;\r
+\r
+import jp.nyatla.nyartoolkit.core.NyARCode;\r
+\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCameraCapture;\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener;\r
+import jp.nyatla.nyartoolkit.jogl.utils.*;\r
+\r
+\r
+public class JavaSimpleLite2 implements GLEventListener,JmfCaptureListener\r
+{\r
+    private final String CARCODE_FILE1 ="../../Data/patt.hiro";\r
+    private final String CARCODE_FILE2 ="../../Data/patt.kanji";\r
+    private final String PARAM_FILE   ="../../Data/camera_para.dat";\r
+       \r
+    private final static int SCREEN_X=640;\r
+    private final static int SCREEN_Y=480;\r
+    private Animator animator;\r
+    private GLNyARRaster_RGB cap_image;\r
+    \r
+    private JmfCameraCapture capture;\r
+    private GL  gl;\r
+    private NyARGLUtil glnya;\r
+\r
+\r
+    //NyARToolkit関係\r
+    private GLNyARDetectMarker nya;\r
+    private GLNyARParam ar_param;\r
+    /**\r
+     * 立方体を書く\r
+     *\r
+     */\r
+    void drawCube()\r
+    {\r
+       // Colour cube data.\r
+       int polyList = 0;\r
+       float fSize = 0.5f;//マーカーサイズに対して0.5倍なので、4cmのナタデココ\r
+       int f, i;       \r
+       float[][] cube_vertices=new float[][]{\r
+               {1.0f, 1.0f, 1.0f}, {1.0f, -1.0f, 1.0f}, {-1.0f, -1.0f, 1.0f}, {-1.0f, 1.0f, 1.0f},\r
+               {1.0f, 1.0f, -1.0f}, {1.0f, -1.0f, -1.0f}, {-1.0f, -1.0f, -1.0f}, {-1.0f, 1.0f, -1.0f}\r
+       };\r
+       float[][] cube_vertex_colors=new float[][]{\r
+       {1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 1.0f, 1.0f},\r
+       {1.0f, 0.0f, 1.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f}\r
+       };\r
+       int cube_num_faces = 6;\r
+       short[][] cube_faces =new short[][]{\r
+       {3, 2, 1, 0}, {2, 3, 7, 6}, {0, 1, 5, 4}, {3, 0, 4, 7}, {1, 2, 6, 5}, {4, 5, 6, 7}\r
+       };\r
+       \r
+       if (polyList==0) {\r
+            polyList = gl.glGenLists (1);\r
+            gl.glNewList(polyList, GL.GL_COMPILE);\r
+            gl.glBegin(GL.GL_QUADS);\r
+            for (f = 0; f < cube_num_faces; f++)\r
+                for (i = 0; i < 4; i++) {\r
+                    gl.glColor3f (cube_vertex_colors[cube_faces[f][i]][0], cube_vertex_colors[cube_faces[f][i]][1], cube_vertex_colors[cube_faces[f][i]][2]);\r
+                    gl.glVertex3f(cube_vertices[cube_faces[f][i]][0] * fSize, cube_vertices[cube_faces[f][i]][1] * fSize, cube_vertices[cube_faces[f][i]][2] * fSize);\r
+                }\r
+            gl.glEnd();\r
+            gl.glColor3f(0.0f, 0.0f, 0.0f);\r
+            for (f = 0; f < cube_num_faces; f++) {\r
+               gl.glBegin (GL.GL_LINE_LOOP);\r
+               for (i = 0; i < 4; i++)\r
+                       gl.glVertex3f(cube_vertices[cube_faces[f][i]][0] * fSize, cube_vertices[cube_faces[f][i]][1] * fSize, cube_vertices[cube_faces[f][i]][2] * fSize);\r
+               gl.glEnd ();\r
+            }\r
+            gl.glEndList ();\r
+       }\r
+       \r
+       gl.glPushMatrix(); // Save world coordinate system.\r
+       gl.glTranslatef(0.0f, 0.0f, 0.5f); // Place base of cube on marker surface.\r
+       gl.glRotatef(0.0f, 0.0f, 0.0f, 1.0f); // Rotate about z axis.\r
+       gl.glDisable(GL.GL_LIGHTING);   // Just use colours.\r
+       gl.glCallList(polyList);        // Draw the cube.\r
+       gl.glPopMatrix();       // Restore world coordinate system.\r
+       \r
+    }\r
+    \r
+    \r
+    \r
+    public JavaSimpleLite2()\r
+    {\r
+        Frame frame = new Frame("Java simpleLite with NyARToolkit");\r
+\r
+\r
+        // 3Dを描画するコンポーネント\r
+        GLCanvas canvas = new GLCanvas();\r
+        frame.add(canvas);\r
+        canvas.addGLEventListener(this);\r
+        frame.addWindowListener(new WindowAdapter() {\r
+                public void windowClosing(WindowEvent e) {\r
+                    System.exit(0);\r
+                }\r
+            });\r
+\r
+        frame.setVisible(true);\r
+        Insets ins=frame.getInsets();\r
+        frame.setSize(SCREEN_X+ins.left+ins.right,SCREEN_Y+ins.top+ins.bottom);\r
+        canvas.setBounds(ins.left,ins.top,SCREEN_X,SCREEN_Y);\r
+    }\r
+\r
+    public void init(GLAutoDrawable drawable) {\r
+        gl = drawable.getGL();\r
+        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);\r
+        //NyARToolkitの準備\r
+        try{\r
+            //キャプチャの準備\r
+            capture=new JmfCameraCapture(SCREEN_X,SCREEN_Y,15f,JmfCameraCapture.PIXEL_FORMAT_RGB);\r
+            capture.setCaptureListener(this);\r
+            //NyARToolkitの準備\r
+            ar_param=new GLNyARParam();\r
+            ar_param.loadFromARFile(PARAM_FILE);\r
+            ar_param.changeSize(SCREEN_X,SCREEN_Y);\r
+\r
+            //ARコードを2個ロード\r
+            double[] width=new double[]{80.0,80.0};\r
+            NyARCode[] ar_codes=new NyARCode[2];\r
+            ar_codes[0]=new NyARCode(16,16);\r
+            ar_codes[0].loadFromARFile(CARCODE_FILE1);\r
+            ar_codes[1]=new NyARCode(16,16);\r
+            ar_codes[1].loadFromARFile(CARCODE_FILE2);\r
+            nya=new GLNyARDetectMarker(ar_param,ar_codes,width,2);\r
+            nya.setContinueMode(false);//ここをtrueにすると、transMatContinueモード(History計算)になります。\r
+            //NyARToolkit用の支援クラス\r
+            glnya=new NyARGLUtil(gl,ar_param);\r
+            //GL対応のRGBラスタオブジェクト\r
+            cap_image=new GLNyARRaster_RGB(gl,ar_param);\r
+            //キャプチャ開始\r
+            capture.start();\r
+       }catch(Exception e){\r
+            e.printStackTrace();\r
+        }\r
+        animator = new Animator(drawable);\r
+\r
+        animator.start();\r
+\r
+    }\r
+\r
+    public void reshape(GLAutoDrawable drawable,\r
+        int x, int y,\r
+        int width, int height)\r
+    {\r
+        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);\r
+        gl.glViewport(0, 0,  width, height);\r
+\r
+        //視体積の設定\r
+        gl.glMatrixMode(GL.GL_PROJECTION);\r
+        gl.glLoadIdentity();\r
+        //見る位置\r
+        gl.glMatrixMode(GL.GL_MODELVIEW);\r
+        gl.glLoadIdentity();\r
+    }\r
+\r
+    public void display(GLAutoDrawable drawable)\r
+    {\r
+        \r
+        try{\r
+            if(!cap_image.hasData()){\r
+               return;\r
+            }    \r
+            gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.          \r
+            //画像チェックしてマーカー探して、背景を書く\r
+            int found_markers;\r
+            synchronized(cap_image){\r
+               found_markers=nya.detectMarkerLite(cap_image,110);\r
+               //背景を書く\r
+               glnya.drawBackGround(cap_image, 1.0);\r
+            }\r
+            //あったら立方体を書く\r
+            double[] matrix=new double[16]; \r
+            for(int i=0;i<found_markers;i++){\r
+               //1番のマーカーでなければ表示しない。\r
+               if(nya.getARCodeIndex(i)!=0){\r
+                   continue;\r
+               }\r
+               //マーカーの一致度を調査するならば、ここでnya.getConfidence()で一致度を調べて下さい。\r
+                // Projection transformation.\r
+                gl.glMatrixMode(GL.GL_PROJECTION);\r
+                gl.glLoadMatrixd(ar_param.getCameraFrustumRH(),0);\r
+                gl.glMatrixMode(GL.GL_MODELVIEW);\r
+                // Viewing transformation.\r
+                gl.glLoadIdentity();\r
+                nya.getCameraViewRH(i,matrix);\r
+                gl.glLoadMatrixd(matrix,0);\r
+\r
+            \r
+                // All other lighting and geometry goes here.\r
+                drawCube();\r
+            }\r
+            Thread.sleep(1);//タスク実行権限を一旦渡す            \r
+        }catch(Exception e){\r
+            e.printStackTrace();\r
+        }\r
+    }\r
+    public void onUpdateBuffer(Buffer i_buffer)\r
+    {\r
+       try{\r
+           synchronized(cap_image){\r
+               cap_image.setBuffer(i_buffer, true);\r
+           }\r
+       }catch(Exception e){\r
+           e.printStackTrace();\r
+       }        \r
+    }\r
+\r
+    public void displayChanged(GLAutoDrawable drawable,\r
+                               boolean modeChanged,\r
+                               boolean deviceChanged) {}\r
+\r
+    public static void main(String[] args) {\r
+        new JavaSimpleLite2();\r
+    }\r
+}\r
+\r
diff --git a/trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/utils/GLNyARDetectMarker.java b/trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/utils/GLNyARDetectMarker.java
new file mode 100644 (file)
index 0000000..7425cb8
--- /dev/null
@@ -0,0 +1,64 @@
+/**\r
+ * NyARSingleDetectMarkerにOpenGL向け関数を追加したもの\r
+ * (c)2008 A虎@nyatla.jp\r
+ * airmail(at)ebony.plala.or.jp\r
+ * http://nyatla.jp/\r
+ */\r
+package jp.nyatla.nyartoolkit.jogl.utils;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.NyARCode;\r
+import jp.nyatla.nyartoolkit.core.NyARParam;\r
+import jp.nyatla.nyartoolkit.core.NyARTransMatResult;\r
+import jp.nyatla.nyartoolkit.detector.*;\r
+\r
+public class GLNyARDetectMarker extends NyARDetectMarker\r
+{\r
+    private NyARTransMatResult trans_mat_result=new NyARTransMatResult();\r
+    private double view_scale_factor=0.025;//#define VIEW_SCALEFACTOR          0.025           // 1.0 ARToolKit unit becomes 0.025 of my OpenGL units.\r
+    public GLNyARDetectMarker(NyARParam i_param,NyARCode[] i_code,double[] i_marker_width,int i_number_of_code) throws NyARException\r
+    {\r
+       super(i_param,i_code,i_marker_width,i_number_of_code);  \r
+    }\r
+    public void setScaleFactor(double i_new_value)\r
+    {\r
+       view_scale_factor=i_new_value;\r
+    }\r
+    /**\r
+     * @param i_index\r
+     * マーカーのインデックス番号を指定します。\r
+     * 直前に実行したdetectMarkerLiteの戻り値未満かつ0以上である必要があります。\r
+     * @param o_result\r
+     * 結果値を格納する配列を指定してください。double[16]以上が必要です。\r
+     * @throws NyARException\r
+     */\r
+    public void getCameraViewRH(int i_index,double[] o_result) throws NyARException\r
+    {\r
+       //座標を計算\r
+       this.getTransmationMatrix(i_index,this.trans_mat_result);\r
+       //行列変換\r
+       double[][] para=this.trans_mat_result.getArray();\r
+       o_result[0 + 0*4] = para[0][0]; // R1C1\r
+       o_result[0 + 1*4] = para[0][1]; // R1C2\r
+       o_result[0 + 2*4] = para[0][2];\r
+       o_result[0 + 3*4] = para[0][3];\r
+       o_result[1 + 0*4] = -para[1][0]; // R2\r
+       o_result[1 + 1*4] = -para[1][1];\r
+       o_result[1 + 2*4] = -para[1][2];\r
+       o_result[1 + 3*4] = -para[1][3];\r
+       o_result[2 + 0*4] = -para[2][0]; // R3\r
+       o_result[2 + 1*4] = -para[2][1];\r
+       o_result[2 + 2*4] = -para[2][2];\r
+       o_result[2 + 3*4] = -para[2][3];\r
+       o_result[3 + 0*4] = 0.0;\r
+       o_result[3 + 1*4] = 0.0;\r
+       o_result[3 + 2*4] = 0.0;\r
+       o_result[3 + 3*4] = 1.0;\r
+       if (view_scale_factor != 0.0) {\r
+           o_result[12] *= view_scale_factor;\r
+           o_result[13] *= view_scale_factor;\r
+           o_result[14] *= view_scale_factor;\r
+       }\r
+       return;\r
+    }\r
+}\r
index ddda998..3fa5266 100644 (file)
@@ -8,12 +8,13 @@ package jp.nyatla.nyartoolkit.jogl.utils;
 \r
 import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.NyARCode;\r
-import jp.nyatla.nyartoolkit.core.NyARMat;\r
 import jp.nyatla.nyartoolkit.core.NyARParam;\r
+import jp.nyatla.nyartoolkit.core.NyARTransMatResult;\r
 import jp.nyatla.nyartoolkit.detector.*;\r
 \r
 public class GLNyARSingleDetectMarker extends NyARSingleDetectMarker\r
 {\r
+    private NyARTransMatResult trans_mat_result=new NyARTransMatResult();\r
     private double view_scale_factor=0.025;//#define VIEW_SCALEFACTOR          0.025           // 1.0 ARToolKit unit becomes 0.025 of my OpenGL units.\r
     public GLNyARSingleDetectMarker(NyARParam i_param,NyARCode i_code,double i_marker_width) throws NyARException\r
     {\r
@@ -26,32 +27,43 @@ public class GLNyARSingleDetectMarker extends NyARSingleDetectMarker
     //    public static void arglCameraViewRH(const double para[3][4], GLdouble m_modelview[16], const double scale)\r
     public double[] getCameraViewRH() throws NyARException\r
     {\r
+       double[] result=new double[16];\r
+       getCameraViewRH(result);\r
+       return result;\r
+    }\r
+    /**\r
+     * \r
+     * @param o_result\r
+     * 結果値を格納する配列を指定してください。double[16]以上が必要です。\r
+     * @throws NyARException\r
+     */\r
+    public void getCameraViewRH(double[] o_result) throws NyARException\r
+    {\r
        //座標を計算\r
-       NyARMat mat=getTransmationMatrix();\r
+       this.getTransmationMatrix(this.trans_mat_result);\r
        //行列変換\r
-       double[][] para=mat.getArray();\r
-       double[] result=new double[16];\r
-       result[0 + 0*4] = para[0][0]; // R1C1\r
-       result[0 + 1*4] = para[0][1]; // R1C2\r
-       result[0 + 2*4] = para[0][2];\r
-       result[0 + 3*4] = para[0][3];\r
-       result[1 + 0*4] = -para[1][0]; // R2\r
-       result[1 + 1*4] = -para[1][1];\r
-       result[1 + 2*4] = -para[1][2];\r
-       result[1 + 3*4] = -para[1][3];\r
-       result[2 + 0*4] = -para[2][0]; // R3\r
-       result[2 + 1*4] = -para[2][1];\r
-       result[2 + 2*4] = -para[2][2];\r
-       result[2 + 3*4] = -para[2][3];\r
-       result[3 + 0*4] = 0.0;\r
-       result[3 + 1*4] = 0.0;\r
-       result[3 + 2*4] = 0.0;\r
-       result[3 + 3*4] = 1.0;\r
-       if (view_scale_factor != 0.0) {\r
-           result[12] *= view_scale_factor;\r
-           result[13] *= view_scale_factor;\r
-           result[14] *= view_scale_factor;\r
-       }\r
-       return result;\r
+       double[][] para=this.trans_mat_result.getArray();\r
+       o_result[0 + 0*4] = para[0][0]; // R1C1\r
+       o_result[0 + 1*4] = para[0][1]; // R1C2\r
+       o_result[0 + 2*4] = para[0][2];\r
+       o_result[0 + 3*4] = para[0][3];\r
+       o_result[1 + 0*4] = -para[1][0]; // R2\r
+       o_result[1 + 1*4] = -para[1][1];\r
+       o_result[1 + 2*4] = -para[1][2];\r
+       o_result[1 + 3*4] = -para[1][3];\r
+       o_result[2 + 0*4] = -para[2][0]; // R3\r
+       o_result[2 + 1*4] = -para[2][1];\r
+       o_result[2 + 2*4] = -para[2][2];\r
+       o_result[2 + 3*4] = -para[2][3];\r
+       o_result[3 + 0*4] = 0.0;\r
+       o_result[3 + 1*4] = 0.0;\r
+       o_result[3 + 2*4] = 0.0;\r
+       o_result[3 + 3*4] = 1.0;\r
+       if (view_scale_factor != 0.0) {\r
+           o_result[12] *= view_scale_factor;\r
+           o_result[13] *= view_scale_factor;\r
+           o_result[14] *= view_scale_factor;\r
+       }\r
+       return;\r
     }\r
 }\r
index e49acc0..32143de 100644 (file)
@@ -36,11 +36,41 @@ import jp.nyatla.nyartoolkit.core.raster.*;
 \r
 public interface NyARColorPatt\r
 {\r
+//     消すかも。\r
+//    /**\r
+//     * カラーパターンのサイズを変更します。\r
+//     * 変更を行うと、既にgetPatArrayで参照中の配列内容は不定になり、インスタンスのパラメータは初期状態に戻ります。\r
+//     * @param i_new_width\r
+//     * 新しいパターン幅\r
+//     * @param i_new_height\r
+//     * 新しいパターン高\r
+//     */\r
+//    public void setSize(int i_new_width,int i_new_height);\r
+    /**\r
+     * カラーパターンの幅をピクセル値で返します。\r
+     * @return\r
+     */\r
     public int getWidth();\r
+    /**\r
+     * カラーパターンの高さをピクセル値で返します。\r
+     * @return\r
+     */\r
     public int getHeight();\r
+    /**\r
+     * カメラパターンを格納した配列への参照値を返します。\r
+     * 配列は最低でも[height][wight][3]のサイズを持ちますが、\r
+     * 配列のlengthとwidth,heightの数は一致しないことがあります。\r
+     * setSize関数を実行すると、以前に呼び出されたgetPatArrayが返した値は不定になります。\r
+     * @return\r
+     */\r
     public int[][][] getPatArray();\r
-    public void pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException;\r
-}\r
-\r
-\r
-\r
+    /**\r
+     * ラスタイメージからi_marker部分のカラーパターンを抽出して、保持します。\r
+     * @param image\r
+     * @param i_marker\r
+     * @return\r
+     * ラスターの取得に成功するとTRUE/失敗するとFALSE\r
+     * @throws NyARException\r
+     */\r
+    public boolean pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException;\r
+}
\ No newline at end of file
index 8e0e399..0800cb1 100644 (file)
@@ -48,11 +48,28 @@ public class NyARColorPatt_O1 implements NyARColorPatt
     private int height;\r
     public NyARColorPatt_O1(int i_width,int i_height)\r
     {\r
-       this.width=i_width;\r
+       this.width =i_width;\r
        this.height=i_height;\r
        this.extpat=new int[i_height][i_width][3];\r
        this.wk_pickFromRaster_ext_pat2=new int[i_height][i_width][3];\r
     }\r
+//    public void setSize(int i_new_width,int i_new_height)\r
+//    {\r
+//     int array_w=this.extpat[0].length;\r
+//     int array_h=this.extpat.length;\r
+//     //十分なサイズのバッファがあるか確認\r
+//     if(array_w>=i_new_width && array_h>=i_new_height){\r
+//         //OK 十分だ→サイズ調整のみ\r
+//     }else{\r
+//         //足りないよ→取り直し\r
+//         this.wk_pickFromRaster_ext_pat2=new int[i_new_height][i_new_width][3];\r
+//         this.extpat=new int[i_new_height][i_new_width][3];\r
+//     }\r
+//        this.width =i_new_width;\r
+//        this.height=i_new_height;\r
+//        return;        \r
+//    }\r
+    \r
     public int[][][] getPatArray()\r
     {\r
        return extpat;\r
@@ -76,14 +93,14 @@ public class NyARColorPatt_O1 implements NyARColorPatt
      * [3x3]\r
      * @throws NyARException\r
      */\r
-    private void get_cpara( double world[][], double vertex[][],double[] para) throws NyARException\r
+    private boolean get_cpara( double world[][], double vertex[][],double[] para) throws NyARException\r
     {\r
         NyARMat a =wk_get_cpara_a;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 8 );\r
         double[][] a_array=a.getArray();\r
         NyARMat b =wk_get_cpara_b;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 1 );\r
         double[][] b_array=b.getArray();\r
         double[] a_pt0,a_pt1,world_pti;\r
-           \r
+\r
         for(int i = 0; i < 4; i++ ) {\r
             a_pt0=a_array[i*2];\r
             a_pt1=a_array[i*2+1];\r
@@ -109,7 +126,9 @@ public class NyARColorPatt_O1 implements NyARColorPatt
             b_array[i*2+1][0]=vertex[i][1];//b->m[i*2+1] = vertex[i][1];\r
         }\r
 //         JartkException.trap("未チェックのパス");\r
-        a.matrixSelfInv();\r
+        if(!a.matrixSelfInv()){\r
+            return false;//逆行列を求められないので失敗\r
+        }\r
            \r
 //         JartkException.trap("未チェックのパス");\r
         NyARMat c = wk_get_cpara_c;//次処理で結果を受け取るので、初期化不要//new NyARMat( 8, 1 );\r
@@ -124,6 +143,7 @@ public class NyARColorPatt_O1 implements NyARColorPatt
         para[2*3+0] = c_array[2*3+0][0];//para[2][0] = c->m[2*3+0];\r
         para[2*3+1] = c_array[2*3+1][0];//para[2][1] = c->m[2*3+1];\r
         para[2*3+2] = 1.0;//para[2][2] = 1.0;\r
+        return true;\r
     }\r
 \r
     private final double[][] wk_pickFromRaster_local=new double[4][2];\r
@@ -160,9 +180,11 @@ public class NyARColorPatt_O1 implements NyARColorPatt
      * Optimize:STEP[769->]\r
      * @param image\r
      * @param i_marker\r
+     * @return\r
+     * 切り出しに失敗した\r
      * @throws Exception\r
      */\r
-    public void pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException\r
+    public boolean pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException\r
     {\r
        double          d, xw, yw;\r
        int             xc, yc;\r
@@ -195,7 +217,10 @@ public class NyARColorPatt_O1 implements NyARColorPatt
        world[3][0] = 100.0;\r
        world[3][1] = 100.0 + 10.0;*/\r
        double[] para =wk_pickFromRaster_para; //double    para[3][3];\r
-       get_cpara( world, local, para );\r
+       //パターンの切り出しに失敗することもある。\r
+       if(!get_cpara( world, local, para )){\r
+           return false;\r
+       }\r
        lx1 = (int)((local[0][0] - local[1][0])*(local[0][0] - local[1][0])+ (local[0][1] - local[1][1])*(local[0][1] - local[1][1]));\r
        lx2 = (int)((local[2][0] - local[3][0])*(local[2][0] - local[3][0])+ (local[2][1] - local[3][1])*(local[2][1] - local[3][1]));\r
        ly1 = (int)((local[1][0] - local[2][0])*(local[1][0] - local[2][0])+ (local[1][1] - local[2][1])*(local[1][1] - local[2][1]));\r
@@ -294,6 +319,6 @@ public class NyARColorPatt_O1 implements NyARColorPatt
            }\r
        }\r
        /*</Optimize>*/\r
-       return;\r
+       return true;\r
     }\r
 }
\ No newline at end of file
index 795acd7..ca2dcc2 100644 (file)
@@ -53,6 +53,22 @@ public class NyARColorPatt_O2 implements NyARColorPatt
        this.extpat=new int[i_height][i_width][3];\r
        this.wk_pickFromRaster_ext_pat2=new int[i_height][i_width][3];\r
     }\r
+//    public void setSize(int i_new_width,int i_new_height)\r
+//    {\r
+//     int array_w=this.extpat[0].length;\r
+//     int array_h=this.extpat.length;\r
+//     //十分なサイズのバッファがあるか確認\r
+//     if(array_w>=i_new_width && array_h>=i_new_height){\r
+//         //OK 十分だ→サイズ調整のみ\r
+//     }else{\r
+//         //足りないよ→取り直し\r
+//         this.wk_pickFromRaster_ext_pat2=new int[i_new_height][i_new_width][3];\r
+//         this.extpat=new int[i_new_height][i_new_width][3];\r
+//     }\r
+//        this.width =i_new_width;\r
+//        this.height=i_new_height;\r
+//        return;\r
+//    }\r
     public int[][][] getPatArray()\r
     {\r
        return extpat;\r
@@ -69,71 +85,64 @@ public class NyARColorPatt_O2 implements NyARColorPatt
     private final NyARMat wk_get_cpara_b=new NyARMat(8,1);\r
 //    private final NyARMat wk_get_cpara_c=new NyARMat(8,1);\r
     /**\r
-     * \r
-     * @param world\r
-     * @param vertex\r
-     * @param para\r
-     * [3x3]\r
-     * @throws NyARException\r
-     */\r
-    /**\r
      * @param world\r
      * @param vertex\r
      * @param o_para\r
      * @throws NyARException\r
      */\r
-    private void get_cpara(double vertex_0[], double vertex_1[],NyARMat o_para) throws NyARException\r
+    private boolean get_cpara(double vertex_0[], double vertex_1[],NyARMat o_para) throws NyARException\r
     {\r
        double world[][]=this.wk_pickFromRaster_world;\r
-        NyARMat a =wk_get_cpara_a;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 8 );\r
-        double[][] a_array=a.getArray();\r
-        NyARMat b =wk_get_cpara_b;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 1 );\r
-        double[][] b_array=b.getArray();\r
-        double[] a_pt0,a_pt1,world_pti;\r
-           \r
-        for(int i = 0; i < 4; i++ ) {\r
-            a_pt0=a_array[i*2];\r
-            a_pt1=a_array[i*2+1];\r
-            world_pti=world[i];\r
-            \r
-            a_pt0[0]=world_pti[0];//a->m[i*16+0]  = world[i][0];\r
-            a_pt0[1]=world_pti[1];//a->m[i*16+1]  = world[i][1];\r
-            a_pt0[2]=1.0;//a->m[i*16+2]  = 1.0;\r
-            a_pt0[3]=0.0;//a->m[i*16+3]  = 0.0;\r
-            a_pt0[4]=0.0;//a->m[i*16+4]  = 0.0;\r
-            a_pt0[5]=0.0;//a->m[i*16+5]  = 0.0;\r
-            a_pt0[6]=-world_pti[0] * vertex_0[i];//a->m[i*16+6]  = -world[i][0] * vertex[i][0];\r
-            a_pt0[7]=-world_pti[1] * vertex_0[i];//a->m[i*16+7]  = -world[i][1] * vertex[i][0];\r
-            a_pt1[0]=0.0;//a->m[i*16+8]  = 0.0;\r
-            a_pt1[1]=0.0;//a->m[i*16+9]  = 0.0;\r
-            a_pt1[2]=0.0;//a->m[i*16+10] = 0.0;\r
-            a_pt1[3]=world_pti[0];//a->m[i*16+11] = world[i][0];\r
-            a_pt1[4]=world_pti[1];//a->m[i*16+12] = world[i][1];\r
-            a_pt1[5]=1.0;//a->m[i*16+13] = 1.0;\r
-            a_pt1[6]=-world_pti[0] * vertex_1[i];//a->m[i*16+14] = -world[i][0] * vertex[i][1];\r
-            a_pt1[7]=-world_pti[1] * vertex_1[i];//a->m[i*16+15] = -world[i][1] * vertex[i][1];\r
-            b_array[i*2+0][0]=vertex_0[i];//b->m[i*2+0] = vertex[i][0];\r
-            b_array[i*2+1][0]=vertex_1[i];//b->m[i*2+1] = vertex[i][1];\r
-        }\r
-//         JartkException.trap("未チェックのパス");\r
-        a.matrixSelfInv();\r
-           \r
-//         JartkException.trap("未チェックのパス");\r
-//        NyARMat c = wk_get_cpara_c;//次処理で結果を受け取るので、初期化不要//new NyARMat( 8, 1 );\r
-//        double[][] c_array=c.getArray();\r
+       NyARMat a =wk_get_cpara_a;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 8 );\r
+       double[][] a_array=a.getArray();\r
+       NyARMat b =wk_get_cpara_b;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 1 );\r
+       double[][] b_array=b.getArray();\r
+       double[] a_pt0,a_pt1,world_pti;\r
 \r
-        o_para.matrixMul(a, b);\r
-//        para[0*3+0] = c_array[0*3+0][0];//para[i][0] = c->m[i*3+0];\r
-//        para[0*3+1] = c_array[0*3+1][0];//para[i][1] = c->m[i*3+1];\r
-//        para[0*3+2] = c_array[0*3+2][0];//para[i][2] = c->m[i*3+2];\r
-//        para[1*3+0] = c_array[1*3+0][0];//para[i][0] = c->m[i*3+0];\r
-//        para[1*3+1] = c_array[1*3+1][0];//para[i][1] = c->m[i*3+1];\r
-//        para[i*3+2] = c_array[1*3+2][0];//para[i][2] = c->m[i*3+2];\r
-//        para[2*3+0] = c_array[2*3+0][0];//para[2][0] = c->m[2*3+0];\r
-//        para[2*3+1] = c_array[2*3+1][0];//para[2][1] = c->m[2*3+1];\r
-//        para[2*3+2] = 1.0;//para[2][2] = 1.0;\r
-        \r
+       for(int i = 0; i < 4; i++ ) {\r
+           a_pt0=a_array[i*2];\r
+           a_pt1=a_array[i*2+1];\r
+           world_pti=world[i];\r
 \r
+           a_pt0[0]=world_pti[0];//a->m[i*16+0]  = world[i][0];\r
+           a_pt0[1]=world_pti[1];//a->m[i*16+1]  = world[i][1];\r
+           a_pt0[2]=1.0;//a->m[i*16+2]  = 1.0;\r
+           a_pt0[3]=0.0;//a->m[i*16+3]  = 0.0;\r
+           a_pt0[4]=0.0;//a->m[i*16+4]  = 0.0;\r
+           a_pt0[5]=0.0;//a->m[i*16+5]  = 0.0;\r
+           a_pt0[6]=-world_pti[0] * vertex_0[i];//a->m[i*16+6]  = -world[i][0] * vertex[i][0];\r
+           a_pt0[7]=-world_pti[1] * vertex_0[i];//a->m[i*16+7]  = -world[i][1] * vertex[i][0];\r
+           a_pt1[0]=0.0;//a->m[i*16+8]  = 0.0;\r
+           a_pt1[1]=0.0;//a->m[i*16+9]  = 0.0;\r
+           a_pt1[2]=0.0;//a->m[i*16+10] = 0.0;\r
+           a_pt1[3]=world_pti[0];//a->m[i*16+11] = world[i][0];\r
+           a_pt1[4]=world_pti[1];//a->m[i*16+12] = world[i][1];\r
+           a_pt1[5]=1.0;//a->m[i*16+13] = 1.0;\r
+           a_pt1[6]=-world_pti[0] * vertex_1[i];//a->m[i*16+14] = -world[i][0] * vertex[i][1];\r
+           a_pt1[7]=-world_pti[1] * vertex_1[i];//a->m[i*16+15] = -world[i][1] * vertex[i][1];\r
+           b_array[i*2+0][0]=vertex_0[i];//b->m[i*2+0] = vertex[i][0];\r
+           b_array[i*2+1][0]=vertex_1[i];//b->m[i*2+1] = vertex[i][1];\r
+       }\r
+//     JartkException.trap("未チェックのパス");\r
+       if(!a.matrixSelfInv()){\r
+           return false;\r
+       }\r
+\r
+//     JartkException.trap("未チェックのパス");\r
+//     NyARMat c = wk_get_cpara_c;//次処理で結果を受け取るので、初期化不要//new NyARMat( 8, 1 );\r
+//     double[][] c_array=c.getArray();\r
+\r
+       o_para.matrixMul(a, b);\r
+//     para[0*3+0] = c_array[0*3+0][0];//para[i][0] = c->m[i*3+0];\r
+//     para[0*3+1] = c_array[0*3+1][0];//para[i][1] = c->m[i*3+1];\r
+//     para[0*3+2] = c_array[0*3+2][0];//para[i][2] = c->m[i*3+2];\r
+//     para[1*3+0] = c_array[1*3+0][0];//para[i][0] = c->m[i*3+0];\r
+//     para[1*3+1] = c_array[1*3+1][0];//para[i][1] = c->m[i*3+1];\r
+//     para[i*3+2] = c_array[1*3+2][0];//para[i][2] = c->m[i*3+2];\r
+//     para[2*3+0] = c_array[2*3+0][0];//para[2][0] = c->m[2*3+0];\r
+//     para[2*3+1] = c_array[2*3+1][0];//para[2][1] = c->m[2*3+1];\r
+//     para[2*3+2] = 1.0;//para[2][2] = 1.0;\r
+       return true;\r
     }\r
 \r
   //   private final double[] wk_pickFromRaster_para=new double[9];//[3][3];\r
@@ -173,7 +182,7 @@ public class NyARColorPatt_O2 implements NyARColorPatt
      * @param i_marker\r
      * @throws Exception\r
      */\r
-    public void pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException\r
+    public boolean pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException\r
     {\r
        NyARMat cpara=this.wk_pickFromRaster_cpara;\r
        //localの計算\r
@@ -232,7 +241,9 @@ public class NyARColorPatt_O2 implements NyARColorPatt
        }       \r
        \r
        //cparaの計算\r
-       get_cpara(local_0,local_1,cpara);\r
+       if(!get_cpara(local_0,local_1,cpara)){\r
+           return false;\r
+       }\r
 \r
        int img_x=image.getWidth();\r
        int img_y=image.getHeight();\r
@@ -307,6 +318,6 @@ public class NyARColorPatt_O2 implements NyARColorPatt
                extpat_j_i[2]=(ext_pat2_j_i[2] / xdiv_x_ydiv);//ext_pat[j][i][2] = (byte)(ext_pat2[j][i][2] / (xdiv*ydiv));\r
            }\r
        }\r
-       return;\r
+       return true;\r
     }\r
 }
\ No newline at end of file
index 472509d..19c569f 100644 (file)
@@ -54,6 +54,21 @@ public class NyARColorPatt_O3 implements NyARColorPatt
        this.height=i_height;\r
        this.extpat=new int[i_height][i_width][3];\r
     }\r
+//    public void setSize(int i_new_width,int i_new_height)\r
+//    {\r
+//     int array_w=this.extpat[0].length;\r
+//     int array_h=this.extpat.length;\r
+//     //十分なサイズのバッファがあるか確認\r
+//     if(array_w>=i_new_width && array_h>=i_new_height){\r
+//         //OK 十分だ→サイズ調整のみ\r
+//     }else{\r
+//         //足りないよ→取り直し\r
+//         this.extpat=new int[i_new_height][i_new_width][3];\r
+//     }\r
+//        this.width =i_new_width;\r
+//        this.height=i_new_height;\r
+//        return;\r
+//    }    \r
     public int[][][] getPatArray()\r
     {\r
        return extpat;\r
@@ -70,59 +85,50 @@ public class NyARColorPatt_O3 implements NyARColorPatt
     private final NyARMat wk_get_cpara_b=new NyARMat(8,1);\r
 \r
     /**\r
-     * \r
-     * @param world\r
-     * @param vertex\r
-     * @param para\r
-     * [3x3]\r
-     * @throws NyARException\r
-     */\r
-    /**\r
      * @param world\r
      * @param vertex\r
      * @param o_para\r
      * @throws NyARException\r
      */\r
-    private void get_cpara(double vertex_0[], double vertex_1[],NyARMat o_para) throws NyARException\r
+    private boolean get_cpara(double vertex_0[], double vertex_1[],NyARMat o_para) throws NyARException\r
     {\r
        double world[][]=this.wk_pickFromRaster_world;\r
-        NyARMat a =wk_get_cpara_a;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 8 );\r
-        double[][] a_array=a.getArray();\r
-        NyARMat b =wk_get_cpara_b;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 1 );\r
-        double[][] b_array=b.getArray();\r
-        double[] a_pt0,a_pt1,world_pti;\r
-           \r
-        for(int i = 0; i < 4; i++ ) {\r
-            a_pt0=a_array[i*2];\r
-            a_pt1=a_array[i*2+1];\r
-            world_pti=world[i];\r
-            \r
-            a_pt0[0]=world_pti[0];//a->m[i*16+0]  = world[i][0];\r
-            a_pt0[1]=world_pti[1];//a->m[i*16+1]  = world[i][1];\r
-            a_pt0[2]=1.0;//a->m[i*16+2]  = 1.0;\r
-            a_pt0[3]=0.0;//a->m[i*16+3]  = 0.0;\r
-            a_pt0[4]=0.0;//a->m[i*16+4]  = 0.0;\r
-            a_pt0[5]=0.0;//a->m[i*16+5]  = 0.0;\r
-            a_pt0[6]=-world_pti[0] * vertex_0[i];//a->m[i*16+6]  = -world[i][0] * vertex[i][0];\r
-            a_pt0[7]=-world_pti[1] * vertex_0[i];//a->m[i*16+7]  = -world[i][1] * vertex[i][0];\r
-            a_pt1[0]=0.0;//a->m[i*16+8]  = 0.0;\r
-            a_pt1[1]=0.0;//a->m[i*16+9]  = 0.0;\r
-            a_pt1[2]=0.0;//a->m[i*16+10] = 0.0;\r
-            a_pt1[3]=world_pti[0];//a->m[i*16+11] = world[i][0];\r
-            a_pt1[4]=world_pti[1];//a->m[i*16+12] = world[i][1];\r
-            a_pt1[5]=1.0;//a->m[i*16+13] = 1.0;\r
-            a_pt1[6]=-world_pti[0] * vertex_1[i];//a->m[i*16+14] = -world[i][0] * vertex[i][1];\r
-            a_pt1[7]=-world_pti[1] * vertex_1[i];//a->m[i*16+15] = -world[i][1] * vertex[i][1];\r
-            b_array[i*2+0][0]=vertex_0[i];//b->m[i*2+0] = vertex[i][0];\r
-            b_array[i*2+1][0]=vertex_1[i];//b->m[i*2+1] = vertex[i][1];\r
-        }\r
-        a.matrixSelfInv();\r
-           \r
+       NyARMat a =wk_get_cpara_a;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 8 );\r
+       double[][] a_array=a.getArray();\r
+       NyARMat b =wk_get_cpara_b;//次処理で値を設定するので、初期化不要// new NyARMat( 8, 1 );\r
+       double[][] b_array=b.getArray();\r
+       double[] a_pt0,a_pt1,world_pti;\r
 \r
-        o_para.matrixMul(a, b);\r
+       for(int i = 0; i < 4; i++ ) {\r
+           a_pt0=a_array[i*2];\r
+           a_pt1=a_array[i*2+1];\r
+           world_pti=world[i];\r
 \r
-        \r
+           a_pt0[0]=world_pti[0];//a->m[i*16+0]  = world[i][0];\r
+           a_pt0[1]=world_pti[1];//a->m[i*16+1]  = world[i][1];\r
+           a_pt0[2]=1.0;//a->m[i*16+2]  = 1.0;\r
+           a_pt0[3]=0.0;//a->m[i*16+3]  = 0.0;\r
+           a_pt0[4]=0.0;//a->m[i*16+4]  = 0.0;\r
+           a_pt0[5]=0.0;//a->m[i*16+5]  = 0.0;\r
+           a_pt0[6]=-world_pti[0] * vertex_0[i];//a->m[i*16+6]  = -world[i][0] * vertex[i][0];\r
+           a_pt0[7]=-world_pti[1] * vertex_0[i];//a->m[i*16+7]  = -world[i][1] * vertex[i][0];\r
+           a_pt1[0]=0.0;//a->m[i*16+8]  = 0.0;\r
+           a_pt1[1]=0.0;//a->m[i*16+9]  = 0.0;\r
+           a_pt1[2]=0.0;//a->m[i*16+10] = 0.0;\r
+           a_pt1[3]=world_pti[0];//a->m[i*16+11] = world[i][0];\r
+           a_pt1[4]=world_pti[1];//a->m[i*16+12] = world[i][1];\r
+           a_pt1[5]=1.0;//a->m[i*16+13] = 1.0;\r
+           a_pt1[6]=-world_pti[0] * vertex_1[i];//a->m[i*16+14] = -world[i][0] * vertex[i][1];\r
+           a_pt1[7]=-world_pti[1] * vertex_1[i];//a->m[i*16+15] = -world[i][1] * vertex[i][1];\r
+           b_array[i*2+0][0]=vertex_0[i];//b->m[i*2+0] = vertex[i][0];\r
+           b_array[i*2+1][0]=vertex_1[i];//b->m[i*2+1] = vertex[i][1];\r
+       }\r
+       if(!a.matrixSelfInv()){\r
+           return false;\r
+       }           \r
 \r
+       o_para.matrixMul(a, b);\r
+       return true;\r
     }\r
 \r
   //   private final double[] wk_pickFromRaster_para=new double[9];//[3][3];\r
@@ -160,7 +166,7 @@ public class NyARColorPatt_O3 implements NyARColorPatt
      * @param i_marker\r
      * @throws Exception\r
      */\r
-    public void pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException\r
+    public boolean pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException\r
     {\r
        NyARMat cpara=this.wk_pickFromRaster_cpara;\r
        //localの計算\r
@@ -219,10 +225,12 @@ public class NyARColorPatt_O3 implements NyARColorPatt
        }       \r
        \r
        //cparaの計算\r
-       get_cpara(local_0,local_1,cpara);\r
+       if(!get_cpara(local_0,local_1,cpara)){\r
+           return false;\r
+       }\r
        updateExtpat(image,cpara,xdiv2,ydiv2);\r
 \r
-       return;\r
+       return true;\r
     }\r
     //かなり大きいワークバッファを取るな…。\r
     private double[] wk_updateExtpat_para00_xw;\r
index 98125e1..4b26969 100644 (file)
@@ -50,8 +50,16 @@ public class NyARMat{
      * 返された配列のサイズを行列の大きさとして使わないこと!\r
      * \r
      */\r
-    private double[][] m;\r
+    protected double[][] m;\r
     private int clm,row;\r
+    /**\r
+     * デフォルトコンストラクタは機能しません。\r
+     * @throws NyARException\r
+     */\r
+    protected NyARMat() throws NyARException\r
+    {\r
+       throw new NyARException();\r
+    }\r
     public NyARMat(int i_row,int i_clm)\r
     {\r
        m=new double[i_row][i_clm];\r
@@ -97,6 +105,25 @@ public class NyARMat{
            }\r
        }\r
     }\r
+    /**\r
+     * i_copy_fromの内容を自分自身にコピーします。\r
+     * 高さ・幅は同一で無いと失敗します。\r
+     * @param i_copy_from\r
+     */\r
+    public void copyFrom(NyARMat i_copy_from)throws NyARException\r
+    {\r
+       //サイズ確認\r
+       if(this.row!=i_copy_from.row ||this.clm!=i_copy_from.clm)\r
+       {\r
+           throw new NyARException();\r
+       }\r
+       //値コピー\r
+       for(int r=this.row-1;r>=0;r--){\r
+           for(int c=this.clm-1;c>=0;c--){\r
+               this.m[r][c]=i_copy_from.m[r][c];\r
+           }\r
+       }\r
+    }\r
 \r
     public double[][] getArray()\r
     {\r
@@ -132,15 +159,18 @@ public class NyARMat{
        }\r
     }\r
     private int[] wk_nos_matrixSelfInv=new int[50];\r
-    private final static double matrixSelfInv_epsl=1.0e-10;\r
+//    private final static double matrixSelfInv_epsl=1.0e-10;\r
     /**\r
      * i_targetを逆行列に変換する。arMatrixSelfInv()と、arMatrixSelfInv_minv()関数を合成してあります。\r
      * OPTIMIZE STEP[485->422]\r
      * @param i_target\r
      * 逆行列にする行列\r
+     * @return\r
+     * 逆行列があればTRUE/無ければFALSE\r
+     * \r
      * @throws NyARException\r
      */\r
-    public void matrixSelfInv() throws NyARException\r
+    public boolean matrixSelfInv() throws NyARException\r
     {\r
        double[][] ap=this.m;\r
        int dimen=this.row;\r
@@ -157,7 +187,7 @@ public class NyARMat{
            throw new NyARException();\r
        case 1:\r
            ap[0][0]=1.0/ap[0][0];//*ap = 1.0 / (*ap);\r
-           return;/* 1 dimension */\r
+           return true;/* 1 dimension */\r
        }\r
 \r
         for(int n = 0; n < dimen ; n++){\r
@@ -180,8 +210,10 @@ public class NyARMat{
                    ip = i;\r
                }\r
             }\r
-            if (p <= matrixSelfInv_epsl){\r
-                return;\r
+//          if (p <= matrixSelfInv_epsl){\r
+            if(p==0.0){\r
+               return false;\r
+//                throw new NyARException();\r
             }\r
 \r
             nwork  = nos[ip];\r
@@ -227,7 +259,7 @@ public class NyARMat{
                 ap_i[n]=work;//*wbp = work;\r
            }\r
         }\r
-        return;\r
+        return true;\r
     }\r
     /**\r
      * sourceの転置行列をdestに得る。arMatrixTrans()の代替品\r
index f9d4014..2fe7862 100644 (file)
@@ -272,6 +272,41 @@ public class NyARParam{
        }\r
     }\r
     /**\r
+     * ideal2Observをまとめて実行します。\r
+     * @param i_in\r
+     * double[][2]\r
+     * @param o_out\r
+     * double[][2]\r
+     */\r
+    public void ideal2ObservBatch(double[][] i_in,double[][] o_out,int i_size)\r
+    {\r
+\r
+       double    x, y, d;\r
+       final double d0,d1,d3,d2_w;\r
+       final double df[]=this.dist_factor;\r
+       d0=df[0];\r
+       d1=df[1];\r
+       d3=df[3];\r
+       d2_w=df[2]/100000000.0;\r
+       for(int i=0;i<i_size;i++){\r
+            x = (i_in[i][0] - d0) * d3;\r
+            y = (i_in[i][1] - d1) * d3;\r
+            if( x == 0.0 && y == 0.0 ) {\r
+               o_out[i][0]=d0;\r
+               o_out[i][1]=d1;\r
+            }else{\r
+                d = 1.0 - d2_w * (x*x+y*y);\r
+                o_out[i][0]=x * d + d0;\r
+                o_out[i][1]=y * d + d1;\r
+            }\r
+       }\r
+       return;\r
+    }    \r
+    \r
+    \r
+    \r
+    \r
+    /**\r
      * int arParamObserv2Ideal( const double dist_factor[4], const double ox, const double oy,double *ix, double *iy );\r
      * \r
      * @param ox\r
@@ -322,7 +357,7 @@ public class NyARParam{
      * @param i_x_coord\r
      * @param i_y_coord\r
      * @param i_start\r
-     * 開始点\r
+     * coord開始点\r
      * @param i_num\r
      * 計算数\r
      * @param o_ideal\r
index 67b25dd..e813de8 100644 (file)
@@ -33,17 +33,18 @@ package jp.nyatla.nyartoolkit.core;
 \r
 \r
 \r
-import jp.nyatla.nyartoolkit.NyARException;\r
+\r
+import jp.nyatla.nyartoolkit.*;\r
 \r
 \r
 /**\r
- * This class calculates ARMatrix from square information and holds it.\r
+ * This class calculates ARMatrix from square information.\r
  * --\r
- * å¤\89æ\8f\9bè¡\8cå\88\97ã\82\92è¨\88ç®\97ã\81\97ã\81¦ã\80\81çµ\90æ\9e\9cã\82\92ä¿\9dæ\8c\81ã\81\99ã\82\8bã\82¯ã\83©ã\82¹ã\80\82\r
+ * 変換行列を計算するクラス。\r
  *\r
  */\r
 public interface NyARTransMat{\r
     public void setCenter(double i_x,double i_y);\r
-    public NyARMat getTransformationMatrix();\r
-    public double transMat( NyARSquare square,int i_direction, double width)throws NyARException;\r
+    public double transMat(NyARSquare i_square,int i_direction, double i_width,NyARTransMatResult o_result)throws NyARException;\r
+    public double transMatContinue(NyARSquare i_square,int i_direction, double i_width,NyARTransMatResult io_result_conv)throws NyARException;\r
 }\r
diff --git a/trunk/src/jp/nyatla/nyartoolkit/core/NyARTransMatResult.java b/trunk/src/jp/nyatla/nyartoolkit/core/NyARTransMatResult.java
new file mode 100644 (file)
index 0000000..b0c89ec
--- /dev/null
@@ -0,0 +1,93 @@
+/* \r
+ * PROJECT: NyARToolkit\r
+ * --------------------------------------------------------------------------------\r
+ *\r
+ * The NyARToolkit is Java version ARToolkit class library.\r
+ * Copyright (C)2008 R.Iizuka\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this framework; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.core;\r
+\r
+import jp.nyatla.nyartoolkit.*;\r
+/**\r
+ * NyARTransMat戻り値専用のNyARMat\r
+ *\r
+ */\r
+public class NyARTransMatResult extends NyARMat\r
+{\r
+    private boolean has_value=false;\r
+    public NyARTransMatResult()\r
+    {\r
+       super(3,4);\r
+    }\r
+    /**\r
+     * この関数は使えません。\r
+     * @param i_row\r
+     * @param i_clm\r
+     * @throws NyARException\r
+     */\r
+    public NyARTransMatResult(int i_row,int i_clm) throws NyARException\r
+    {\r
+       super();//ここで例外発生\r
+    }\r
+    /**\r
+     * パラメータで変換行列を更新します。\r
+     * @param i_rot\r
+     * @param i_off\r
+     * @param i_trans\r
+     */\r
+    public void updateMatrixValue(NyARTransRot i_rot,double[] i_off,double[] i_trans)\r
+    {\r
+       double[] pa;\r
+       double[] rot=i_rot.getArray();\r
+\r
+       pa=this.m[0];\r
+        pa[0] = rot[0*3+0];\r
+        pa[1] = rot[0*3+1];\r
+        pa[2] = rot[0*3+2];\r
+        pa[3] = rot[0*3+0]*i_off[0] + rot[0*3+1]*i_off[1] + rot[0*3+2]*i_off[2] + i_trans[0];\r
+\r
+        pa=this.m[1];\r
+        pa[0] = rot[1*3+0];\r
+        pa[1] = rot[1*3+1];\r
+        pa[2] = rot[1*3+2];\r
+        pa[3] = rot[1*3+0]*i_off[0] + rot[1*3+1]*i_off[1] + rot[1*3+2]*i_off[2] + i_trans[1];\r
+\r
+        pa=this.m[2];\r
+        pa[0] = rot[2*3+0];\r
+        pa[1] = rot[2*3+1];\r
+        pa[2] = rot[2*3+2];\r
+        pa[3] = rot[2*3+0]*i_off[0] + rot[2*3+1]*i_off[1] + rot[2*3+2]*i_off[2] + i_trans[2];\r
+\r
+\r
+        this.has_value=true;\r
+        return;\r
+    }\r
+    public void copyFrom(NyARTransMatResult i_from) throws NyARException\r
+    {\r
+       super.copyFrom(i_from);\r
+        this.has_value=i_from.has_value;\r
+    }\r
+    public boolean hasValue()\r
+    {\r
+       return this.has_value;\r
+    }\r
+}\r
index 2dfbc42..3f72e5c 100644 (file)
@@ -41,12 +41,13 @@ public class NyARTransMat_O1 implements NyARTransMat{
 \r
     private final static int AR_GET_TRANS_MAT_MAX_LOOP_COUNT=5;//#define   AR_GET_TRANS_MAT_MAX_LOOP_COUNT         5\r
     private final static double AR_GET_TRANS_MAT_MAX_FIT_ERROR=1.0;//#define   AR_GET_TRANS_MAT_MAX_FIT_ERROR          1.0\r
+    private final static double AR_GET_TRANS_CONT_MAT_MAX_FIT_ERROR=1.0;\r
     private final static int P_MAX=10;//頂点の数(4で十分だけどなんとなく10)//#define P_MAX       500\r
     private final static int NUMBER_OF_VERTEX=4;//処理対象の頂点数\r
     private final NyARTransRot transrot;\r
     private final double[] center={0.0,0.0};\r
     private final NyARParam param;\r
-    private final NyARMat result_mat=new NyARMat(3,4);\r
+//    private final NyARMat result_mat=new NyARMat(3,4);\r
     public NyARTransMat_O1(NyARParam i_param)throws NyARException\r
     {\r
        param=i_param;\r
@@ -58,10 +59,10 @@ public class NyARTransMat_O1 implements NyARTransMat{
        center[0]=i_x;\r
        center[1]=i_x;\r
     }\r
-    public NyARMat getTransformationMatrix()\r
-    {\r
-       return result_mat;\r
-    }\r
+//    public NyARMat getTransformationMatrix()\r
+//    {\r
+//     return result_mat;\r
+//    }\r
 \r
     private final double[][] wk_transMat_pos3d=new double[P_MAX][3];//pos3d[P_MAX][3];\r
     private final double[][] wk_transMat_ppos2d=new double[4][2];\r
@@ -74,11 +75,15 @@ public class NyARTransMat_O1 implements NyARTransMat{
      * @param square\r
      * 計算対象のNyARSquareオブジェクト\r
      * @param i_direction\r
-     * @param width\r
+     * マーカーの方向\r
+     * @param i_width\r
+     * マーカーのサイズ(mm)\r
+     * @param o_result_conv\r
+     * 変換行列を受け取るオブジェクトを指定します。\r
      * @return\r
      * @throws NyARException\r
      */\r
-    public double transMat( NyARSquare square,int i_direction, double width)throws NyARException\r
+    public double transMat(NyARSquare square,int i_direction,double i_width,NyARTransMatResult o_result_conv)throws NyARException\r
     {\r
        double[][]  ppos2d=wk_transMat_ppos2d;\r
        double[][]  ppos3d=wk_transMat_ppos3d;\r
@@ -100,14 +105,14 @@ public class NyARTransMat_O1 implements NyARTransMat{
        ppos2d[2][1] = square.sqvertex[(6-dir)%4][1];\r
        ppos2d[3][0] = square.sqvertex[(7-dir)%4][0];\r
        ppos2d[3][1] = square.sqvertex[(7-dir)%4][1];\r
-       ppos3d[0][0] = center[0] - width/2.0;\r
-       ppos3d[0][1] = center[1] + width/2.0;\r
-       ppos3d[1][0] = center[0] + width/2.0;\r
-       ppos3d[1][1] = center[1] + width/2.0;\r
-       ppos3d[2][0] = center[0] + width/2.0;\r
-       ppos3d[2][1] = center[1] - width/2.0;\r
-       ppos3d[3][0] = center[0] - width/2.0;\r
-       ppos3d[3][1] = center[1] - width/2.0;\r
+       ppos3d[0][0] = center[0] - i_width/2.0;\r
+       ppos3d[0][1] = center[1] + i_width/2.0;\r
+       ppos3d[1][0] = center[0] + i_width/2.0;\r
+       ppos3d[1][1] = center[1] + i_width/2.0;\r
+       ppos3d[2][0] = center[0] + i_width/2.0;\r
+       ppos3d[2][1] = center[1] - i_width/2.0;\r
+       ppos3d[3][0] = center[0] - i_width/2.0;\r
+       ppos3d[3][1] = center[1] - i_width/2.0;\r
 \r
        //arGetTransMat3の前段処理(pos3dとoffを初期化)\r
        arGetTransMat3_initPos3d(ppos3d,pos3d,off);\r
@@ -115,13 +120,98 @@ public class NyARTransMat_O1 implements NyARTransMat{
 \r
 \r
        for(int i=0;i<AR_GET_TRANS_MAT_MAX_LOOP_COUNT; i++ ) {\r
-           err = arGetTransMat3(ppos2d, pos3d,off);\r
+           err = arGetTransMat3(ppos2d, pos3d,off,o_result_conv);\r
            if( err < AR_GET_TRANS_MAT_MAX_FIT_ERROR ){\r
                break;\r
            }\r
        }\r
+\r
        return err;\r
     }\r
+    /**\r
+     * transMatContinue用のワーク\r
+     */\r
+    private final NyARTransMatResult wk_transMatContinue_result=new NyARTransMatResult();\r
+    /**\r
+     * double arGetTransMatCont( ARMarkerInfo *marker_info, double prev_conv[3][4],double center[2], double width, double conv[3][4] )\r
+     *     \r
+     * @param i_square\r
+     * @param i_direction\r
+     * マーカーの方位を指定する。\r
+     * @param i_width\r
+     * @param io_result_conv\r
+     * 計算履歴を持つNyARTransMatResultオブジェクトを指定する。\r
+     * 履歴を持たない場合は、transMatと同じ処理を行う。\r
+     * @return\r
+     * @throws NyARException\r
+     */\r
+    public double transMatContinue(NyARSquare i_square,int i_direction, double i_width,NyARTransMatResult io_result_conv)throws NyARException\r
+    {\r
+       //io_result_convが初期値なら、transMatで計算する。\r
+       if(!io_result_conv.hasValue()){\r
+           return this.transMat(i_square, i_direction, i_width, io_result_conv);\r
+       }\r
+       \r
+       \r
+       \r
+       double  err1,err2;\r
+       int     i,dir;\r
+       double[][]  ppos2d=wk_transMat_ppos2d;\r
+       double[][]  ppos3d=wk_transMat_ppos3d;\r
+       double[]    off   =wk_transMat_off;\r
+       double[][]  pos3d=wk_transMat_pos3d;\r
+\r
+       //arGetTransMatContSub計算部分\r
+       transrot.initRotByPrevResult(io_result_conv);\r
+\r
+       dir = i_direction;\r
+       ppos2d[0][0] = i_square.sqvertex[(4-dir)%4][0];\r
+       ppos2d[0][1] = i_square.sqvertex[(4-dir)%4][1];\r
+       ppos2d[1][0] = i_square.sqvertex[(5-dir)%4][0];\r
+       ppos2d[1][1] = i_square.sqvertex[(5-dir)%4][1];\r
+       ppos2d[2][0] = i_square.sqvertex[(6-dir)%4][0];\r
+       ppos2d[2][1] = i_square.sqvertex[(6-dir)%4][1];\r
+       ppos2d[3][0] = i_square.sqvertex[(7-dir)%4][0];\r
+       ppos2d[3][1] = i_square.sqvertex[(7-dir)%4][1];\r
+       ppos3d[0][0] = center[0] - i_width/2.0;\r
+       ppos3d[0][1] = center[1] + i_width/2.0;\r
+       ppos3d[1][0] = center[0] + i_width/2.0;\r
+       ppos3d[1][1] = center[1] + i_width/2.0;\r
+       ppos3d[2][0] = center[0] + i_width/2.0;\r
+       ppos3d[2][1] = center[1] - i_width/2.0;\r
+       ppos3d[3][0] = center[0] - i_width/2.0;\r
+       ppos3d[3][1] = center[1] - i_width/2.0;\r
+\r
+       //arGetTransMat3の前段処理(pos3dとoffを初期化)\r
+       arGetTransMat3_initPos3d(ppos3d,pos3d,off);\r
+\r
+       err1=err2=-1;\r
+       for( i = 0; i < AR_GET_TRANS_MAT_MAX_LOOP_COUNT; i++ ) {\r
+           err1 = arGetTransMat3(ppos2d, pos3d,off,io_result_conv);\r
+           if( err1 < AR_GET_TRANS_MAT_MAX_FIT_ERROR ){\r
+               //十分な精度を達成できたらブレーク\r
+               break;\r
+           }\r
+       }\r
+\r
+       //エラー値が許容範囲でなければTransMatをやり直し\r
+       if(err1>AR_GET_TRANS_CONT_MAT_MAX_FIT_ERROR ) {\r
+           NyARTransMatResult result2=this.wk_transMatContinue_result;\r
+           //transMatを実行\r
+           transrot.initRot(i_square,i_direction);\r
+            err2 = transMat(i_square,i_direction,i_width,result2);\r
+           //transmMatここまで\r
+           if(err2<err1){\r
+               io_result_conv.copyFrom(result2);\r
+               err1 = err2;\r
+           }\r
+       }\r
+       return err1;\r
+    }\r
+\r
+\r
\r
+\r
     private final double[] wk_arGetTransMat3_initPos3d_pmax=new double[3];\r
     private final double[] wk_arGetTransMat3_initPos3d_pmin=new double[3];\r
     /**\r
@@ -155,6 +245,10 @@ public class NyARTransMat_O1 implements NyARTransMat{
            if( i_ppos3d[i][1] < pmin[1] ){\r
                pmin[1] = i_ppos3d[i][1];\r
            }\r
+           /*  オリジナルでもコメントアウト\r
+               if( ppos3d[i][2] > pmax[2] ) pmax[2] = ppos3d[i][2];\r
+               if( ppos3d[i][2] < pmin[2] ) pmin[2] = ppos3d[i][2];\r
+            */     \r
        }\r
        o_off[0] = -(pmax[0] + pmin[0]) / 2.0;\r
        o_off[1] = -(pmax[1] + pmin[1]) / 2.0;\r
@@ -186,14 +280,22 @@ public class NyARTransMat_O1 implements NyARTransMat{
     private final double arGetTransMat3(\r
            double ppos2d[][],\r
            final double i_pos3d[][],\r
-           final double i_off[])throws NyARException{\r
-       \r
+           final double i_off[],\r
+           NyARTransMatResult o_result_conv)throws NyARException{\r
+\r
        double  ret;\r
-       ret = arGetTransMatSub(ppos2d, i_pos3d);\r
-       double[][] conv=result_mat.getArray();\r
-       conv[0][3] = conv[0][0]*i_off[0] + conv[0][1]*i_off[1] + conv[0][2]*i_off[2] + conv[0][3];\r
-       conv[1][3] = conv[1][0]*i_off[0] + conv[1][1]*i_off[1] + conv[1][2]*i_off[2] + conv[1][3];\r
-       conv[2][3] = conv[2][0]*i_off[0] + conv[2][1]*i_off[1] + conv[2][2]*i_off[2] + conv[2][3];\r
+       ret = arGetTransMatSub(ppos2d,i_pos3d,i_off,o_result_conv);\r
+       \r
+//        double[][] conv=o_result_conv.getArray();\r
+//        double[] rot=transrot.getArray();\r
+//        for(int i=0;i<3;i++){\r
+//            conv[i][0] = rot[i*3+0];\r
+//            conv[i][1] = rot[i*3+1];\r
+//            conv[i][2] = rot[i*3+2];\r
+//        }\r
+//     conv[0][3] = conv[0][0]*i_off[0] + conv[0][1]*i_off[1] + conv[0][2]*i_off[2] + conv[0][3];\r
+//     conv[1][3] = conv[1][0]*i_off[0] + conv[1][1]*i_off[1] + conv[1][2]*i_off[2] + conv[1][3];\r
+//     conv[2][3] = conv[2][0]*i_off[0] + conv[2][1]*i_off[1] + conv[2][2]*i_off[2] + conv[2][3];\r
        return ret;\r
     }\r
     private final NyARMat wk_arGetTransMatSub_mat_a=new NyARMat(NUMBER_OF_VERTEX*2,3);\r
@@ -211,14 +313,12 @@ public class NyARTransMat_O1 implements NyARTransMat{
     /**\r
      * static double arGetTransMatSub( double rot[3][3], double ppos2d[][2],double pos3d[][3], int num, double conv[3][4],double *dist_factor, double cpara[3][4] )\r
      * Optimize:2008.04.20:STEP[1033→1004]\r
-     * @param rot\r
-     * @param ppos2d\r
-     * @param pos3d\r
-     * @param num\r
+     * @param i_ppos2d\r
+     * @param i_pos3d\r
      * @return\r
      * @throws NyARException\r
      */\r
-    private final double arGetTransMatSub(double i_ppos2d[][],double i_pos3d[][]) throws NyARException\r
+    private final double arGetTransMatSub(double i_ppos2d[][],double i_pos3d[][],double[] i_off,NyARTransMatResult o_result_conv) throws NyARException\r
     {\r
        double[][] pos2d=wk_arGetTransMatSub_pos2d;\r
        double cpara[]=param.get34Array();\r
@@ -314,30 +414,33 @@ public class NyARTransMat_O1 implements NyARTransMat{
            c_array[x2][0]  =wz * po2d_pt[0]- cpara[0*4+0]*wx - cpara[0*4+1]*wy - cpara[0*4+2]*wz;//mat_c->m[j*2+0] = wz * pos2d[j][0]- cpara[0][0]*wx - cpara[0][1]*wy - cpara[0][2]*wz;\r
            c_array[x2+1][0]=wz * po2d_pt[1]- cpara[1*4+1]*wy - cpara[1*4+2]*wz;//mat_c->m[j*2+1] = wz * pos2d[j][1]- cpara[1][1]*wy - cpara[1][2]*wz;\r
        }\r
-//     JartkException.trap("未チェックのパス");{\r
+\r
        mat_d.matrixMul(mat_b, mat_a );\r
        mat_e.matrixMul(mat_b, mat_c );\r
        mat_d.matrixSelfInv();\r
        mat_f.matrixMul(mat_d, mat_e );\r
-//     }\r
+\r
        trans[0] = f_array[0][0];//trans[0] = mat_f->m[0];\r
        trans[1] = f_array[1][0];\r
        trans[2] = f_array[2][0];//trans[2] = mat_f->m[2];\r
 \r
 \r
        ret = transrot.modifyMatrix(trans, i_pos3d, pos2d);\r
-       double[][] conv=result_mat.getArray();\r
-       for( i = 2; i >=0; i-- ) {//<Optimize/>for( j = 0; j < 3; j++ ) {\r
-           //<Optimize>\r
-           //for( i = 0; i < 3; i++ ){\r
-           //  conv[j][i] = rot[j][i];\r
-           //}\r
-           conv[i][0] = rot[i*3+0];\r
-           conv[i][1] = rot[i*3+1];\r
-           conv[i][2] = rot[i*3+2];\r
-           //</Optimize>\r
-           conv[i][3] = trans[i];\r
-       }\r
+       //変換行列を保存\r
+       o_result_conv.updateMatrixValue(this.transrot,i_off,trans);\r
+       \r
+//     double[][] conv=o_result_conv.getArray();\r
+//     for( i = 2; i >=0; i-- ) {//<Optimize/>for( j = 0; j < 3; j++ ) {\r
+//         //<Optimize>\r
+//         //for( i = 0; i < 3; i++ ){\r
+//         //  conv[j][i] = rot[j][i];\r
+//         //}\r
+//         conv[i][0] = rot[i*3+0];\r
+//         conv[i][1] = rot[i*3+1];\r
+//         conv[i][2] = rot[i*3+2];\r
+//         //</Optimize>\r
+//         conv[i][3] = trans[i];\r
+//     }\r
        return ret;\r
     }\r
 }\r
index 7a88d24..ce2add8 100644 (file)
@@ -38,19 +38,23 @@ import jp.nyatla.util.DoubleValue;
 \r
 \r
 \r
+\r
+\r
 /**\r
  * This class calculates ARMatrix from square information and holds it.\r
  * --\r
  * 変換行列を計算して、結果を保持するクラス。\r
  *\r
  */\r
-public class NyARTransMat_O2 implements NyARTransMat{\r
+public class NyARTransMat_O2 implements NyARTransMat\r
+{\r
     private final static int AR_FITTING_TO_IDEAL=0;//#define  AR_FITTING_TO_IDEAL          0\r
     private final static int AR_FITTING_TO_INPUT=1;//#define  AR_FITTING_TO_INPUT          1\r
     private final static int   arFittingMode   =AR_FITTING_TO_INPUT;\r
 \r
     private final static int AR_GET_TRANS_MAT_MAX_LOOP_COUNT=5;//#define   AR_GET_TRANS_MAT_MAX_LOOP_COUNT         5\r
     private final static double AR_GET_TRANS_MAT_MAX_FIT_ERROR=1.0;//#define   AR_GET_TRANS_MAT_MAX_FIT_ERROR          1.0\r
+    private final static double AR_GET_TRANS_CONT_MAT_MAX_FIT_ERROR=1.0;\r
     private final static int P_MAX=10;//頂点の数(4で十分だけどなんとなく10)//#define P_MAX       500\r
     private final static int NUMBER_OF_VERTEX=4;//処理対象の頂点数\r
     private final NyARTransRot transrot;\r
@@ -73,16 +77,46 @@ public class NyARTransMat_O2 implements NyARTransMat{
        return result_mat;\r
     }\r
 \r
+    /**\r
+     * transMat関数の初期化関数を分離したものです。\r
+     * @param square\r
+     * @param i_direction\r
+     * @param i_width\r
+     * @param o_ppos2d\r
+     * @param o_ppos3d\r
+     */\r
+    private final void init_transMat_ppos(NyARSquare square,int i_direction,double i_width,double[][] o_ppos2d,double[][] o_ppos3d)\r
+    {  \r
+       o_ppos2d[0][0] = square.sqvertex[(4-i_direction)%4][0];\r
+       o_ppos2d[0][1] = square.sqvertex[(4-i_direction)%4][1];\r
+       o_ppos2d[1][0] = square.sqvertex[(5-i_direction)%4][0];\r
+       o_ppos2d[1][1] = square.sqvertex[(5-i_direction)%4][1];\r
+       o_ppos2d[2][0] = square.sqvertex[(6-i_direction)%4][0];\r
+       o_ppos2d[2][1] = square.sqvertex[(6-i_direction)%4][1];\r
+       o_ppos2d[3][0] = square.sqvertex[(7-i_direction)%4][0];\r
+       o_ppos2d[3][1] = square.sqvertex[(7-i_direction)%4][1];\r
+       \r
+       double c0,c1,w_2;\r
+       c0=center[0];\r
+       c1=center[1];\r
+       w_2 =i_width/2.0;\r
+       \r
+       o_ppos3d[0][0] = c0 - w_2;//center[0] - w/2.0;\r
+       o_ppos3d[0][1] = c1 + w_2;//center[1] + w/2.0;\r
+       o_ppos3d[1][0] = c0 + w_2;//center[0] + w/2.0;\r
+       o_ppos3d[1][1] = c1 + w_2;//center[1] + w/2.0;\r
+       o_ppos3d[2][0] = c0 + w_2;//center[0] + w/2.0;\r
+       o_ppos3d[2][1] = c1 - w_2;//center[1] - w/2.0;\r
+       o_ppos3d[3][0] = c0 - w_2;//center[0] - w/2.0;\r
+       o_ppos3d[3][1] = c1 - w_2;//center[1] - w/2.0;\r
+       return;\r
+    }\r
+    \r
     private final double[][] wk_transMat_pos3d=new double[P_MAX][3];//pos3d[P_MAX][3];\r
     private final double[][] wk_transMat_ppos2d=new double[4][2];\r
     private final double[][] wk_transMat_ppos3d=new double[4][2];\r
     private final double[] wk_transMat_off=new double[3];\r
     private final double[][] wk_transMat_pos2d=new double[P_MAX][2];//pos2d[P_MAX][2];\r
-\r
-\r
-    private final DoubleValue wk_arGetTransMatSub_a1=new DoubleValue();\r
-    private final DoubleValue wk_arGetTransMatSub_a2=new DoubleValue();\r
-    private final NyARMat wk_transMat_mat_a=new NyARMat(NUMBER_OF_VERTEX*2,3);\r
     private final NyARMat wk_transMat_mat_b=new NyARMat(3,NUMBER_OF_VERTEX*2);\r
     private final NyARMat wk_transMat_mat_d=new NyARMat( 3, 3 );    \r
     private final double[] wk_transMat_mat_trans=new double[3];\r
@@ -98,106 +132,117 @@ public class NyARTransMat_O2 implements NyARTransMat{
      * @return\r
      * @throws NyARException\r
      */\r
-    public double transMat( NyARSquare square,int i_direction, double width)throws NyARException\r
+    public double transMat(NyARSquare square,int i_direction, double width,NyARTransMatResult o_result_conv)throws NyARException\r
     {\r
        double[][]  ppos2d=wk_transMat_ppos2d;\r
        double[][]  ppos3d=wk_transMat_ppos3d;\r
-       double[] off=wk_transMat_off;\r
-       double[][] pos3d=wk_transMat_pos3d;\r
-\r
-\r
-       ppos2d[0][0] = square.sqvertex[(4-i_direction)%4][0];\r
-       ppos2d[0][1] = square.sqvertex[(4-i_direction)%4][1];\r
-       ppos2d[1][0] = square.sqvertex[(5-i_direction)%4][0];\r
-       ppos2d[1][1] = square.sqvertex[(5-i_direction)%4][1];\r
-       ppos2d[2][0] = square.sqvertex[(6-i_direction)%4][0];\r
-       ppos2d[2][1] = square.sqvertex[(6-i_direction)%4][1];\r
-       ppos2d[3][0] = square.sqvertex[(7-i_direction)%4][0];\r
-       ppos2d[3][1] = square.sqvertex[(7-i_direction)%4][1];\r
-       ppos3d[0][0] = center[0] - width/2.0;\r
-       ppos3d[0][1] = center[1] + width/2.0;\r
-       ppos3d[1][0] = center[0] + width/2.0;\r
-       ppos3d[1][1] = center[1] + width/2.0;\r
-       ppos3d[2][0] = center[0] + width/2.0;\r
-       ppos3d[2][1] = center[1] - width/2.0;\r
-       ppos3d[3][0] = center[0] - width/2.0;\r
-       ppos3d[3][1] = center[1] - width/2.0;\r
-\r
+       double[]    off   =wk_transMat_off;\r
+       double[][]  pos3d =wk_transMat_pos3d;\r
+       \r
+       //rotationの初期化\r
        transrot.initRot(square,i_direction);\r
 \r
+       //ppos2dとppos3dの初期化\r
+       init_transMat_ppos(square,i_direction,width,ppos2d,ppos3d);\r
+       \r
        //arGetTransMat3の前段処理(pos3dとoffを初期化)\r
-       arGetTransMat3_initPos3d(ppos3d,pos3d,off);\r
-\r
-\r
-       //arGetTransMatSubにあった処理。毎回おなじっぽい。pos2dに変換座標を格納する。\r
        double[][] pos2d=this.wk_transMat_pos2d;\r
-       DoubleValue a1=this.wk_arGetTransMatSub_a1;\r
-       DoubleValue a2=this.wk_arGetTransMatSub_a2;\r
-       if(arFittingMode == AR_FITTING_TO_INPUT ){\r
-           for(int i = 0; i < NUMBER_OF_VERTEX; i++ ) {\r
-               param.ideal2Observ(ppos2d[i][0], ppos2d[i][1],a1,a2);//arParamIdeal2Observ(dist_factor, ppos2d[i][0], ppos2d[i][1],&pos2d[i][0], &pos2d[i][1]);\r
-               pos2d[i][0]=a1.value;\r
-               pos2d[i][1]=a2.value;\r
-           }\r
-       }else{\r
-           for(int i = 0; i < NUMBER_OF_VERTEX; i++ ){\r
-               pos2d[i][0] = ppos2d[i][0];\r
-               pos2d[i][1] = ppos2d[i][1];\r
-           }\r
-       }\r
-\r
-       //変換マトリクスdとbの準備(arGetTransMatSubの一部)\r
-       final double cpara[]=param.get34Array();\r
-       final NyARMat mat_a =this.wk_transMat_mat_a;\r
-       final double[][] a_array=mat_a.getArray();\r
-\r
        final NyARMat mat_b =this.wk_transMat_mat_b;\r
-       final double[][] b_array=mat_b.getArray();\r
-\r
-       int x2;\r
-       for(int i = 0; i < NUMBER_OF_VERTEX; i++ ) {\r
-           x2=i*2;\r
-           //</Optimize>\r
-           a_array[x2  ][0]=b_array[0][x2]=cpara[0*4+0];//mat_a->m[j*6+0] = mat_b->m[num*0+j*2] = cpara[0][0];\r
-           a_array[x2  ][1]=b_array[1][x2]=cpara[0*4+1];//mat_a->m[j*6+1] = mat_b->m[num*2+j*2] = cpara[0][1];\r
-           a_array[x2  ][2]=b_array[2][x2]=cpara[0*4+2]-pos2d[i][0];//mat_a->m[j*6+2] = mat_b->m[num*4+j*2] = cpara[0][2] - pos2d[j][0];\r
-           a_array[x2+1][0]=b_array[0][x2+1]=0.0;//mat_a->m[j*6+3] = mat_b->m[num*0+j*2+1] = 0.0;\r
-           a_array[x2+1][1]=b_array[1][x2+1]=cpara[1*4+1];//mat_a->m[j*6+4] = mat_b->m[num*2+j*2+1] = cpara[1][1];\r
-           a_array[x2+1][2]=b_array[2][x2+1]=cpara[1*4+2] - pos2d[i][1];//mat_a->m[j*6+5] = mat_b->m[num*4+j*2+1] = cpara[1][2] - pos2d[j][1];\r
-       }\r
        final NyARMat mat_d =this.wk_transMat_mat_d;\r
-       mat_d.matrixMul(mat_b,mat_a);\r
-       mat_d.matrixSelfInv();\r
 \r
+       arGetTransMat3_initTransMat(ppos3d,ppos2d,pos2d,pos3d,off,mat_b,mat_d);\r
+       \r
        double  err=-1;\r
-       double[] rot=transrot.getArray();\r
-       double[][] conv=result_mat.getArray();\r
        double[] trans=this.wk_transMat_mat_trans;\r
        for(int i=0;i<AR_GET_TRANS_MAT_MAX_LOOP_COUNT; i++ ){\r
            //<arGetTransMat3>\r
            err = arGetTransMatSub(pos2d, pos3d,mat_b,mat_d,trans);\r
-           conv[0][0] = rot[0*3+0];\r
-           conv[0][1] = rot[0*3+1];\r
-           conv[0][2] = rot[0*3+2];\r
-           conv[1][0] = rot[1*3+0];\r
-           conv[1][1] = rot[1*3+1];\r
-           conv[1][2] = rot[1*3+2];\r
-           conv[2][0] = rot[2*3+0];\r
-           conv[2][1] = rot[2*3+1];\r
-           conv[2][2] = rot[2*3+2];\r
-           conv[0][3] = rot[0*3+0]*off[0] + rot[0*3+1]*off[1] + rot[0*3+2]*off[2] + trans[0];\r
-           conv[1][3] = rot[1*3+0]*off[0] + rot[1*3+1]*off[1] + rot[1*3+2]*off[2] + trans[1];\r
-           conv[2][3] = rot[2*3+0]*off[0] + rot[2*3+1]*off[1] + rot[2*3+2]*off[2] + trans[2];\r
-\r
-           //</arGetTransMat3>\r
+//         //</arGetTransMat3>\r
            if( err < AR_GET_TRANS_MAT_MAX_FIT_ERROR ){\r
                break;\r
            }\r
        }\r
+       //マトリクスの保存\r
+       o_result_conv.updateMatrixValue(this.transrot,off,trans);\r
        return err;\r
     }\r
-    private final double[] wk_arGetTransMat3_initPos3d_pmax=new double[3];\r
-    private final double[] wk_arGetTransMat3_initPos3d_pmin=new double[3];\r
+    private final NyARTransMatResult wk_transMatContinue_result=new NyARTransMatResult();\r
+\r
+    /**\r
+     * double arGetTransMatCont( ARMarkerInfo *marker_info, double prev_conv[3][4],double center[2], double width, double conv[3][4] )\r
+     *     \r
+     * @param i_square\r
+     * @param i_direction\r
+     * マーカーの方位を指定する。\r
+     * @param i_width\r
+     * @param io_result_conv\r
+     * 計算履歴を持つNyARTransMatResultオブジェクトを指定する。\r
+     * 履歴を持たない場合は、transMatと同じ処理を行う。\r
+     * @return\r
+     * @throws NyARException\r
+     */\r
+    public double transMatContinue(NyARSquare i_square,int i_direction, double i_width,NyARTransMatResult io_result_conv)throws NyARException\r
+    {\r
+       //io_result_convが初期値なら、transMatで計算する。\r
+       if(!io_result_conv.hasValue()){\r
+           return this.transMat(i_square, i_direction, i_width, io_result_conv);\r
+       }\r
+\r
+       double[][]  ppos2d=wk_transMat_ppos2d;\r
+       double[][]  ppos3d=wk_transMat_ppos3d;\r
+       double[]    off   =wk_transMat_off;\r
+       double[][]  pos3d =wk_transMat_pos3d;\r
+       \r
+       //      arGetTransMatContSub計算部分\r
+       transrot.initRotByPrevResult(io_result_conv);\r
+\r
+       //ppos2dとppos3dの初期化\r
+       init_transMat_ppos(i_square,i_direction,i_width,ppos2d,ppos3d);\r
+       \r
+       //arGetTransMat3の前段処理(pos3dとoffを初期化)\r
+       double[][] pos2d=this.wk_transMat_pos2d;\r
+       final NyARMat mat_b =this.wk_transMat_mat_b;\r
+       final NyARMat mat_d =this.wk_transMat_mat_d;\r
+\r
+       //transMatに必要な初期値を計算\r
+       arGetTransMat3_initTransMat(ppos3d,ppos2d,pos2d,pos3d,off,mat_b,mat_d);\r
+       \r
+       double  err1,err2;\r
+       int     i;\r
+\r
+       err1=err2=-1;\r
+       double[] trans=this.wk_transMat_mat_trans;\r
+       for( i = 0; i < AR_GET_TRANS_MAT_MAX_LOOP_COUNT; i++ ){\r
+           err1 = arGetTransMatSub(pos2d, pos3d,mat_b,mat_d,trans);\r
+           if( err1 < AR_GET_TRANS_MAT_MAX_FIT_ERROR ){\r
+               //十分な精度を達成できたらブレーク\r
+               break;\r
+           }\r
+       }\r
+       //値を保存\r
+       io_result_conv.updateMatrixValue(this.transrot,off,trans);\r
+       \r
+       //エラー値が許容範囲でなければTransMatをやり直し\r
+       if(err1>AR_GET_TRANS_CONT_MAT_MAX_FIT_ERROR) {\r
+           NyARTransMatResult result2=this.wk_transMatContinue_result;\r
+           //transMatを実行(初期化値は共用)\r
+           transrot.initRot(i_square,i_direction);\r
+            err2 = transMat(i_square,i_direction,i_width,result2);\r
+           //transmMatここまで\r
+           if(err2<err1){\r
+               //良い値が取れたら、差換え\r
+               io_result_conv.copyFrom(result2);\r
+               err1 = err2;\r
+           }\r
+       }\r
+       return err1;\r
+    }    \r
+    \r
+    \r
+    \r
+\r
+    private final NyARMat wk_arGetTransMat3_mat_a=new NyARMat(NUMBER_OF_VERTEX*2,3);\r
+\r
     /**\r
      * arGetTransMat3関数の前処理部分。i_ppos3dから、o_pos3dとoffを計算する。\r
      * 計算結果から再帰的に変更される可能性が無いので、切り離し。\r
@@ -209,30 +254,33 @@ public class NyARTransMat_O2 implements NyARTransMat{
      * [3]\r
      * @throws NyARException\r
      */\r
-    private final void arGetTransMat3_initPos3d(double i_ppos3d[][],double[][] o_pos3d,double[] o_off)throws NyARException\r
+    private final void arGetTransMat3_initTransMat(double[][] i_ppos3d,double[][] i_ppos2d,double[][] o_pos2d,double[][] o_pos3d,double[] o_off,NyARMat o_mat_b,NyARMat o_mat_d)throws NyARException\r
     {\r
-       final double[] pmax=wk_arGetTransMat3_initPos3d_pmax;//new double[3];\r
-       final double[] pmin=wk_arGetTransMat3_initPos3d_pmin;//new double[3];//double  off[3], pmax[3], pmin[3];\r
+       double pmax0,pmax1,pmax2,pmin0,pmin1,pmin2;\r
        int i;\r
-       pmax[0]=pmax[1]=pmax[2] = -10000000000.0;\r
-       pmin[0]=pmin[1]=pmin[2] =  10000000000.0;\r
+       pmax0=pmax1=pmax2 = -10000000000.0;\r
+       pmin0=pmin1=pmin2 =  10000000000.0;\r
        for(i = 0; i < NUMBER_OF_VERTEX; i++ ) {\r
-           if( i_ppos3d[i][0] > pmax[0] ){\r
-               pmax[0] = i_ppos3d[i][0];\r
+           if( i_ppos3d[i][0] > pmax0 ){\r
+               pmax0 = i_ppos3d[i][0];\r
            }\r
-           if( i_ppos3d[i][0] < pmin[0] ){\r
-               pmin[0] = i_ppos3d[i][0];\r
+           if( i_ppos3d[i][0] < pmin0 ){\r
+               pmin0 = i_ppos3d[i][0];\r
            }\r
-           if( i_ppos3d[i][1] > pmax[1] ){\r
-               pmax[1] = i_ppos3d[i][1];\r
+           if( i_ppos3d[i][1] > pmax1 ){\r
+               pmax1 = i_ppos3d[i][1];\r
            }\r
-           if( i_ppos3d[i][1] < pmin[1] ){\r
-               pmin[1] = i_ppos3d[i][1];\r
+           if( i_ppos3d[i][1] < pmin1 ){\r
+               pmin1 = i_ppos3d[i][1];\r
            }\r
+           /*  オリジナルでもコメントアウト\r
+               if( ppos3d[i][2] > pmax[2] ) pmax[2] = ppos3d[i][2];\r
+               if( ppos3d[i][2] < pmin[2] ) pmin[2] = ppos3d[i][2];\r
+            */  \r
        }\r
-       o_off[0] = -(pmax[0] + pmin[0]) / 2.0;\r
-       o_off[1] = -(pmax[1] + pmin[1]) / 2.0;\r
-       o_off[2] = -(pmax[2] + pmin[2]) / 2.0;\r
+       o_off[0] = -(pmax0 + pmin0) / 2.0;\r
+       o_off[1] = -(pmax1 + pmin1) / 2.0;\r
+       o_off[2] = -(pmax2 + pmin2) / 2.0;\r
 \r
 \r
        double[] o_pos3d_pt;\r
@@ -244,6 +292,42 @@ public class NyARTransMat_O2 implements NyARTransMat{
            o_pos3d_pt[1] = i_pos_pd_pt[1] + o_off[1];\r
            o_pos3d_pt[2] = 0.0;\r
        }\r
+       //ココから先でarGetTransMatSubの初期化処理\r
+       //arGetTransMatSubにあった処理。毎回おなじっぽい。pos2dに変換座標を格納する。\r
+       \r
+       if(arFittingMode == AR_FITTING_TO_INPUT ){\r
+           //arParamIdeal2Observをバッチ処理\r
+           param.ideal2ObservBatch(i_ppos2d,o_pos2d,NUMBER_OF_VERTEX);\r
+       }else{\r
+           for(i = 0; i < NUMBER_OF_VERTEX; i++ ){\r
+               o_pos2d[i][0] = i_ppos2d[i][0];\r
+               o_pos2d[i][1] = i_ppos2d[i][1];\r
+           }\r
+       }\r
+\r
+       //変換マトリクスdとbの準備(arGetTransMatSubの一部)\r
+       final double cpara[]=param.get34Array();\r
+       final NyARMat mat_a =this.wk_arGetTransMat3_mat_a;\r
+       final double[][] a_array=mat_a.getArray();\r
+\r
+       //mat_bの設定\r
+       final double[][] b_array=o_mat_b.getArray();\r
+\r
+       int x2;\r
+       for(i = 0; i < NUMBER_OF_VERTEX; i++ ) {\r
+           x2=i*2;\r
+           //</Optimize>\r
+           a_array[x2  ][0]=b_array[0][x2]=cpara[0*4+0];//mat_a->m[j*6+0] = mat_b->m[num*0+j*2] = cpara[0][0];\r
+           a_array[x2  ][1]=b_array[1][x2]=cpara[0*4+1];//mat_a->m[j*6+1] = mat_b->m[num*2+j*2] = cpara[0][1];\r
+           a_array[x2  ][2]=b_array[2][x2]=cpara[0*4+2]-o_pos2d[i][0];//mat_a->m[j*6+2] = mat_b->m[num*4+j*2] = cpara[0][2] - pos2d[j][0];\r
+           a_array[x2+1][0]=b_array[0][x2+1]=0.0;//mat_a->m[j*6+3] = mat_b->m[num*0+j*2+1] = 0.0;\r
+           a_array[x2+1][1]=b_array[1][x2+1]=cpara[1*4+1];//mat_a->m[j*6+4] = mat_b->m[num*2+j*2+1] = cpara[1][1];\r
+           a_array[x2+1][2]=b_array[2][x2+1]=cpara[1*4+2]-o_pos2d[i][1];//mat_a->m[j*6+5] = mat_b->m[num*4+j*2+1] = cpara[1][2] - pos2d[j][1];\r
+       }\r
+       \r
+       //mat_d\r
+       o_mat_d.matrixMul(o_mat_b,mat_a);\r
+       o_mat_d.matrixSelfInv();        \r
     }    \r
 \r
     private final NyARMat wk_arGetTransMatSub_mat_c=new NyARMat(NUMBER_OF_VERTEX*2,1);\r
@@ -313,19 +397,6 @@ public class NyARTransMat_O2 implements NyARTransMat{
        o_trans[1] = f_array[1][0];\r
        o_trans[2] = f_array[2][0];//trans[2] = mat_f->m[2];\r
        ret = transrot.modifyMatrix(o_trans, i_pos3d, i_ppos2d);\r
-\r
-//     double[][] conv=result_mat.getArray();\r
-//     for( i = 2; i >=0; i-- ) {//<Optimize/>for( j = 0; j < 3; j++ ) {\r
-//     //<Optimize>\r
-//     //for( i = 0; i < 3; i++ ){\r
-//     //      conv[j][i] = rot[j][i];\r
-//     //}\r
-//     conv[i][0] = rot[i*3+0];\r
-//     conv[i][1] = rot[i*3+1];\r
-//     conv[i][2] = rot[i*3+2];\r
-//     //</Optimize>\r
-//     conv[i][3] = trans[i];\r
-//     }\r
        return ret;\r
     }\r
 }\r
index 7362f99..40cda6b 100644 (file)
@@ -15,12 +15,12 @@ interface NyARTransRot
      * @throws NyARException\r
      */\r
     public double modifyMatrix(double trans[],double vertex[][], double pos2d[][]) throws NyARException;\r
-    public void initRot(NyARSquare marker_info,int i_direction) throws NyARException;    \r
+    public void initRot(NyARSquare marker_info,int i_direction) throws NyARException;\r
+    public void initRotByPrevResult(NyARTransMatResult i_prev_result);\r
 }\r
 \r
 /**\r
  * NyARTransRot派生クラスで共通に使いそうな関数類をまとめたもの。\r
- * @author atla\r
  *\r
  */\r
 abstract class NyARTransRot_OptimizeCommon implements NyARTransRot\r
@@ -28,6 +28,24 @@ abstract class NyARTransRot_OptimizeCommon implements NyARTransRot
     protected final int number_of_vertex;\r
     protected final double[] array=new double[9];\r
     protected final NyARParam cparam;\r
+    public final void initRotByPrevResult(NyARTransMatResult i_prev_result)\r
+    {\r
+       double[][] prev_array=i_prev_result.getArray();\r
+       double[] pt;\r
+       final double[] L_rot=this.array;\r
+       pt=prev_array[0];\r
+       L_rot[0*3+0]=pt[0];\r
+       L_rot[0*3+1]=pt[1];\r
+       L_rot[0*3+2]=pt[2];\r
+       pt=prev_array[1];\r
+       L_rot[1*3+0]=pt[0];\r
+       L_rot[1*3+1]=pt[1];\r
+       L_rot[1*3+2]=pt[2];\r
+       pt=prev_array[2];\r
+       L_rot[2*3+0]=pt[0];\r
+       L_rot[2*3+1]=pt[1];\r
+       L_rot[2*3+2]=pt[2];\r
+    }\r
     public final double[] getArray()\r
     {\r
        return this.array;\r
@@ -361,18 +379,20 @@ abstract class NyARTransRot_OptimizeCommon implements NyARTransRot
        sinc = Math.sin(c);\r
        cosc = Math.cos(c);\r
        //Optimize\r
-       double CACA,SASA,SACA,SASB,CASB;\r
-       CACA=cosa*cosa;\r
-       SASA=sina*sina;\r
-       SACA=sina*cosa;\r
-       SASB=sina*sinb;\r
-       CASB=cosa*sinb;\r
+       double CACA,SASA,SACA,SASB,CASB,SACACB;\r
+       CACA  =cosa*cosa;\r
+       SASA  =sina*sina;\r
+       SACA  =sina*cosa;\r
+       SASB  =sina*sinb;\r
+       CASB  =cosa*sinb;\r
+       SACACB=SACA*cosb;\r
+       \r
 \r
-       o_rot[0] = CACA*cosb*cosc+SASA*cosc+SACA*cosb*sinc-SACA*sinc;\r
-       o_rot[1] = -CACA*cosb*sinc-SASA*sinc+SACA*cosb*cosc-SACA*cosc;\r
+       o_rot[0] = CACA*cosb*cosc+SASA*cosc+SACACB*sinc-SACA*sinc;\r
+       o_rot[1] = -CACA*cosb*sinc-SASA*sinc+SACACB*cosc-SACA*cosc;\r
        o_rot[2] = CASB;\r
-       o_rot[3] = SACA*cosb*cosc-SACA*cosc+SASA*cosb*sinc+CACA*sinc;\r
-       o_rot[4] = -SACA*cosb*sinc+SACA*sinc+SASA*cosb*cosc+CACA*cosc;\r
+       o_rot[3] = SACACB*cosc-SACA*cosc+SASA*cosb*sinc+CACA*sinc;\r
+       o_rot[4] = -SACACB*sinc+SACA*sinc+SASA*cosb*cosc+CACA*cosc;\r
        o_rot[5] = SASB;\r
        o_rot[6] = -CASB*cosc-SASB*sinc;\r
        o_rot[7] = CASB*sinc-SASB*cosc;\r
diff --git a/trunk/src/jp/nyatla/nyartoolkit/detector/NyARDetectMarker.java b/trunk/src/jp/nyatla/nyartoolkit/detector/NyARDetectMarker.java
new file mode 100644 (file)
index 0000000..fd477a0
--- /dev/null
@@ -0,0 +1,278 @@
+/* \r
+ * PROJECT: NyARToolkit\r
+ * --------------------------------------------------------------------------------\r
+ * This work is based on the original ARToolKit developed by\r
+ *   Hirokazu Kato\r
+ *   Mark Billinghurst\r
+ *   HITLab, University of Washington, Seattle\r
+ * http://www.hitl.washington.edu/artoolkit/\r
+ *\r
+ * The NyARToolkit is Java version ARToolkit class library.\r
+ * Copyright (C)2008 R.Iizuka\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this framework; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.detector;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.*;\r
+import jp.nyatla.nyartoolkit.core.match.NyARMatchPatt_Color_WITHOUT_PCA;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+\r
+\r
+\r
+class NyARDetectMarkerResult\r
+{\r
+    public int arcode_id;\r
+    public int direction;\r
+    public double confidence;\r
+    public NyARSquare ref_square;\r
+}\r
+class NyARDetectMarkerResultHolder\r
+{\r
+    public NyARDetectMarkerResult[] result_array=new NyARDetectMarkerResult[1];\r
+    /**\r
+     * result_holderを最大i_reserve_size個の要素を格納できるように予約します。\r
+     * @param i_reserve_size\r
+     */\r
+    public void reservHolder(int i_reserve_size)\r
+    {\r
+       if(i_reserve_size>=result_array.length){\r
+           int new_size=i_reserve_size+5;\r
+           result_array=new NyARDetectMarkerResult[new_size];\r
+           for(int i=0;i<new_size;i++){\r
+               result_array[i]=new NyARDetectMarkerResult();\r
+           }\r
+       }\r
+    }\r
+}\r
+/**\r
+ * 複数のマーカーを検出し、それぞれに最も一致するARコードを、コンストラクタで登録したARコードから\r
+ * 探すクラスです。最大300個を認識しますが、ゴミラベルを認識したりするので100個程度が限界です。\r
+ *\r
+ */\r
+public class NyARDetectMarker{\r
+    private static final int AR_SQUARE_MAX=300;\r
+    private boolean is_continue=false;\r
+    private NyARMatchPatt_Color_WITHOUT_PCA match_patt;\r
+    private NyARDetectSquare square;\r
+    private final NyARSquareList square_list=new NyARSquareList(AR_SQUARE_MAX);\r
+    private NyARCode[] codes;\r
+    protected NyARTransMat transmat;\r
+    private double[] marker_width;\r
+    private int number_of_code;\r
+    //検出結果の保存用\r
+    private NyARColorPatt patt;\r
+    \r
+    private NyARDetectMarkerResultHolder result_holder=new NyARDetectMarkerResultHolder();\r
+    \r
+    /**\r
+     * 複数のマーカーを検出し、最も一致するARCodeをi_codeから検索するオブジェクトを作ります。\r
+     * @param i_param\r
+     * カメラパラメータを指定します。\r
+     * @param i_code\r
+     * 検出するマーカーのARCode配列を指定します。配列要素のインデックス番号が、そのままgetARCodeIndex関数で\r
+     * 得られるARCodeインデックスになります。\r
+     * 例えば、要素[1]のARCodeに一致したマーカーである場合は、getARCodeIndexは1を返します。\r
+     * 先頭からi_number_of_code個の要素には、有効な値を指定する必要があります。\r
+     * @param i_marker_width\r
+     * i_codeのマーカーサイズをミリメートルで指定した配列を指定します。\r
+     * 先頭からi_number_of_code個の要素には、有効な値を指定する必要があります。\r
+     * @param i_number_of_code\r
+     * i_codeに含まれる、ARCodeの数を指定します。\r
+     * @throws NyARException\r
+     */\r
+    public NyARDetectMarker(NyARParam i_param,NyARCode[] i_code,double[] i_marker_width,int i_number_of_code) throws NyARException\r
+    {\r
+       //解析オブジェクトを作る\r
+       this.square=new NyARDetectSquare(i_param);\r
+       this.transmat=new NyARTransMat_O2(i_param);\r
+       //比較コードを保存\r
+       this.codes=i_code;\r
+       //比較コードの解像度は全部同じかな?(違うとパターンを複数種つくらないといけないから)\r
+       int cw=i_code[0].getWidth();\r
+       int ch=i_code[0].getHeight();\r
+       for(int i=1;i<i_number_of_code;i++){\r
+           if(cw!=i_code[i].getWidth() || ch!=i_code[i].getHeight()){\r
+               //違う解像度のが混ざっている。\r
+               throw new NyARException();\r
+           }\r
+       }       \r
+       //評価パターンのホルダを作る\r
+       this.patt=new NyARColorPatt_O3(cw,ch);\r
+       this.number_of_code=i_number_of_code;\r
+\r
+       this.marker_width=i_marker_width;\r
+       //評価器を作る。\r
+       this.match_patt=new NyARMatchPatt_Color_WITHOUT_PCA();  \r
+    }\r
+    /**\r
+     * i_imageにマーカー検出処理を実行し、結果を記録します。\r
+     * @param i_image\r
+     * マーカーを検出するイメージを指定します。\r
+     * @param i_thresh\r
+     * 検出閾値を指定します。0~255の範囲で指定してください。\r
+     * 通常は100~130くらいを指定します。\r
+     * @return\r
+     * 見つかったマーカーの数を返します。\r
+     * マーカーが見つからない場合は0を返します。\r
+     * @throws NyARException\r
+     */\r
+    public int detectMarkerLite(NyARRaster i_image,int i_thresh) throws NyARException\r
+    {\r
+       NyARSquareList l_square_list=this.square_list;\r
+       //スクエアコードを探す\r
+       square.detectSquare(i_image, i_thresh,l_square_list);\r
+       \r
+       final int number_of_square=l_square_list.getSquareNum();\r
+       //コードは見つかった?\r
+       if(number_of_square<1){\r
+           //ないや。おしまい。\r
+           return 0;\r
+       }\r
+       //保持リストのサイズを調整\r
+       this.result_holder.reservHolder(number_of_square);      \r
+       \r
+       //1スクエア毎に、一致するコードを決定していく\r
+       for(int i=0;i<number_of_square;i++)\r
+       {\r
+           NyARSquare square=l_square_list.getSquare(i);\r
+           //評価基準になるパターンをイメージから切り出す\r
+            if(!this.patt.pickFromRaster(i_image,square)){\r
+               //イメージの切り出しは失敗することもある。\r
+               continue;\r
+            }\r
+            //パターンを評価器にセット\r
+            if(!this.match_patt.setPatt(this.patt)){\r
+                //計算に失敗した。     \r
+                throw new NyARException();\r
+            }\r
+            //コードと順番に比較していく\r
+            int code_index=0;\r
+            match_patt.evaluate(codes[0]);\r
+            double confidence=match_patt.getConfidence();\r
+            int direction=match_patt.getDirection();\r
+            for(int i2=1;i2<this.number_of_code;i2++)\r
+            {\r
+                //コードと比較する\r
+                match_patt.evaluate(codes[i2]);\r
+                double c2=match_patt.getConfidence();\r
+                if(confidence>c2){\r
+                    continue;\r
+                }\r
+                //より一致するARCodeの情報を保存\r
+                code_index  =i2;\r
+                direction   =match_patt.getDirection();\r
+                confidence  =c2;\r
+            }\r
+            //i番目のパターン情報を保存する。\r
+            final NyARDetectMarkerResult result=this.result_holder.result_array[i];\r
+            result.arcode_id =code_index;\r
+            result.confidence=confidence;\r
+            result.direction =direction;\r
+            result.ref_square=square;\r
+       }\r
+       return number_of_square;\r
+    }\r
+    /**\r
+     * i_indexのマーカーに対する変換行列を計算し、結果値をo_resultへ格納します。\r
+     * 直前に実行したdetectMarkerLiteが成功していないと使えません。\r
+     * @param i_index\r
+     * マーカーのインデックス番号を指定します。\r
+     * 直前に実行したdetectMarkerLiteの戻り値未満かつ0以上である必要があります。\r
+     * @param o_result\r
+     * 結果値を受け取るオブジェクトを指定してください。\r
+     * @throws NyARException\r
+     */\r
+    public void getTransmationMatrix(int i_index,NyARTransMatResult o_result) throws NyARException\r
+    {\r
+       final NyARDetectMarkerResult result=this.result_holder.result_array[i_index];\r
+       //一番一致したマーカーの位置とかその辺を計算\r
+       if(is_continue){\r
+           transmat.transMatContinue(result.ref_square,result.direction,marker_width[result.arcode_id],o_result);\r
+       }else{\r
+           transmat.transMat(result.ref_square,result.direction,marker_width[result.arcode_id],o_result);\r
+       }\r
+       return;\r
+    }\r
+    /**\r
+     * i_indexのマーカーの一致度を返します。\r
+     * @param i_index\r
+     * マーカーのインデックス番号を指定します。\r
+     * 直前に実行したdetectMarkerLiteの戻り値未満かつ0以上である必要があります。\r
+     * @return\r
+     * マーカーの一致度を返します。0~1までの値をとります。\r
+     * 一致度が低い場合には、誤認識の可能性が高くなります。\r
+     * @throws NyARException\r
+     */\r
+    public double getConfidence(int i_index)\r
+    {\r
+       return this.result_holder.result_array[i_index].confidence;\r
+    }\r
+    /**\r
+     * i_indexのマーカーの方位を返します。\r
+     * @param i_index\r
+     * マーカーのインデックス番号を指定します。\r
+     * 直前に実行したdetectMarkerLiteの戻り値未満かつ0以上である必要があります。\r
+     * @return\r
+     * 0,1,2,3の何れかを返します。\r
+     */    \r
+    public int getDirection(int i_index)\r
+    {\r
+       return this.result_holder.result_array[i_index].direction;\r
+    }\r
+    /**\r
+     * i_indexのマーカーのARCodeインデックスを返します。\r
+     * @param i_index\r
+     * マーカーのインデックス番号を指定します。\r
+     * 直前に実行したdetectMarkerLiteの戻り値未満かつ0以上である必要があります。\r
+     * @return\r
+     */    \r
+    public int getARCodeIndex(int i_index)\r
+    {\r
+       return this.result_holder.result_array[i_index].arcode_id;\r
+    }    \r
+    /**\r
+     * getTransmationMatrixの計算モードを設定します。\r
+     * @param i_is_continue\r
+     * TRUEなら、transMatContinueを使用します。\r
+     * FALSEなら、transMatを使用します。\r
+     */\r
+    public void setContinueMode(boolean i_is_continue)\r
+    {\r
+       this.is_continue=i_is_continue;\r
+    }\r
+       \r
+}\r
+\r
+       \r
+\r
+       \r
+       \r
+       \r
+       \r
+       \r
+       \r
+\r
+       \r
+\r
+\r
+       \r
+\r
index 06cc864..8790ea9 100644 (file)
@@ -36,11 +36,12 @@ import jp.nyatla.nyartoolkit.core.*;
 import jp.nyatla.nyartoolkit.core.match.NyARMatchPatt_Color_WITHOUT_PCA;\r
 import jp.nyatla.nyartoolkit.core.raster.*;\r
 /**\r
- * 1個のマーカーに対する変換行列を計算するクラスです。\r
+ * 画像からARCodeに最も一致するマーカーを1個検出し、その変換行列を計算するクラスです。\r
  *\r
  */\r
 public class NyARSingleDetectMarker{\r
     private static final int AR_SQUARE_MAX=100;\r
+    private boolean is_continue=false;\r
     private NyARMatchPatt_Color_WITHOUT_PCA match_patt;\r
     private NyARDetectSquare square;\r
     private final NyARSquareList square_list=new NyARSquareList(AR_SQUARE_MAX);\r
@@ -52,6 +53,16 @@ public class NyARSingleDetectMarker{
     private double detected_confidence;\r
     private NyARSquare detected_square;\r
     private NyARColorPatt patt;\r
+    /**\r
+     * 検出するARCodeとカメラパラメータから、1個のARCodeを検出するNyARSingleDetectMarkerインスタンスを作ります。\r
+     * @param i_param\r
+     * カメラパラメータを指定します。\r
+     * @param i_code\r
+     * 検出するARCodeを指定します。\r
+     * @param i_marker_width\r
+     * ARコードの物理サイズを、ミリメートルで指定します。\r
+     * @throws NyARException\r
+     */\r
     public NyARSingleDetectMarker(NyARParam i_param,NyARCode i_code,double i_marker_width) throws NyARException\r
     {\r
        //解析オブジェクトを作る\r
@@ -66,9 +77,12 @@ public class NyARSingleDetectMarker{
        this.match_patt=new NyARMatchPatt_Color_WITHOUT_PCA();  \r
     }\r
     /**\r
-     * i_imageにマーカー検出処理を実行して、結果を保持します。\r
-     * @param dataPtr\r
-     * @param thresh\r
+     * i_imageにマーカー検出処理を実行し、結果を記録します。\r
+     * @param i_image\r
+     * マーカーを検出するイメージを指定します。\r
+     * @param i_thresh\r
+     * 検出閾値を指定します。0~255の範囲で指定してください。\r
+     * 通常は100~130くらいを指定します。\r
      * @return\r
      * マーカーが検出できたかを真偽値で返します。\r
      * @throws NyARException\r
@@ -86,10 +100,11 @@ public class NyARSingleDetectMarker{
            return false;\r
        }\r
 \r
-       //コードの一致度を調べる準備\r
-//     NyARSquare[] squares=square.getSquareArray();\r
        //評価基準になるパターンをイメージから切り出す\r
-       patt.pickFromRaster(i_image,l_square_list.getSquare(0));\r
+       if(!patt.pickFromRaster(i_image,l_square_list.getSquare(0))){\r
+           //パターンの切り出しに失敗\r
+           return false;\r
+       }\r
        //パターンを評価器にセット\r
        if(!this.match_patt.setPatt(patt)){\r
            //計算に失敗した。\r
@@ -123,43 +138,53 @@ public class NyARSingleDetectMarker{
        return true;\r
     }\r
     /**\r
-     * 変換行列を返します。直前に実行したdetectMarkerLiteが成功していないと使えません。\r
-     * @param i_marker_width\r
-     * マーカーの大きさを指定します。\r
-     * @return\r
-     * double[3][4]の変換行列を返します。\r
+     * 検出したマーカーの変換行列を計算して、o_resultへ値を返します。\r
+     * 直前に実行したdetectMarkerLiteが成功していないと使えません。\r
+     * @param o_result\r
+     * 変換行列を受け取るオブジェクトを指定します。\r
      * @throws NyARException\r
-     */\r
-    public NyARMat getTransmationMatrix() throws NyARException\r
+     */    \r
+    public void getTransmationMatrix(NyARTransMatResult o_result) throws NyARException\r
     {\r
        //一番一致したマーカーの位置とかその辺を計算\r
-       transmat.transMat(detected_square,detected_direction,marker_width);\r
-       return transmat.getTransformationMatrix();\r
-    }\r
+       if(is_continue){\r
+           transmat.transMatContinue(detected_square,detected_direction,marker_width,o_result);\r
+       }else{\r
+           transmat.transMat(detected_square,detected_direction,marker_width,o_result);\r
+       }\r
+       return;\r
+    }    \r
+    /**\r
+     * 検出したマーカーの一致度を返します。\r
+     * @return\r
+     * マーカーの一致度を返します。0~1までの値をとります。\r
+     * 一致度が低い場合には、誤認識の可能性が高くなります。\r
+     * @throws NyARException\r
+     */\r
     public double getConfidence()\r
     {\r
        return detected_confidence;\r
     }\r
+    /**\r
+     * 検出したマーカーの方位を返します。\r
+     * @return\r
+     * 0,1,2,3の何れかを返します。\r
+     */\r
     public int getDirection()\r
     {\r
        return detected_direction;\r
     }\r
-    \r
-\r
-       \r
-       \r
-       \r
-       \r
-       \r
-//     public static class arUtil_c{\r
-//             public static final int         arFittingMode   =Config.DEFAULT_FITTING_MODE;\r
-//             private static final int                arImageProcMode =Config.DEFAULT_IMAGE_PROC_MODE;\r
-//             public static final int         arTemplateMatchingMode  =Config.DEFAULT_TEMPLATE_MATCHING_MODE;\r
-//             public static final int         arMatchingPCAMode       =Config.DEFAULT_MATCHING_PCA_MODE;      \r
-               /*int arInitCparam( ARParam *param )*/\r
-\r
-\r
-       \r
+    /**\r
+     * getTransmationMatrixの計算モードを設定します。\r
+     * 初期値はTRUEです。\r
+     * @param i_is_continue\r
+     * TRUEなら、transMatCont互換の計算をします。\r
+     * FALSEなら、transMat互換の計算をします。\r
+     */\r
+    public void setContinueMode(boolean i_is_continue)\r
+    {\r
+       this.is_continue=i_is_continue;\r
+    }\r
 }\r
 \r
        \r
index 5b4d9a6..8fc2013 100644 (file)
@@ -37,9 +37,6 @@ import jp.nyatla.nyartoolkit.detector.*;
 /**\r
  * 320x240のBGRA32で記録されたRAWイメージから、1種類のパターンを認識し、\r
  * その変換行列を1000回求め、それにかかったミリ秒時間を表示します。\r
- * \r
- * \r
- * @author R.iizuka\r
  *\r
  */\r
 public class RawFileTest {\r
@@ -70,19 +67,19 @@ public class RawFileTest {
 \r
        //1パターンのみを追跡するクラスを作成\r
        NyARSingleDetectMarker ar=new NyARSingleDetectMarker(ap,code,80.0);\r
+       NyARTransMatResult result_mat=new NyARTransMatResult();\r
+       ar.setContinueMode(false);\r
        ar.detectMarkerLite(ra,100);\r
-       ar.getTransmationMatrix();\r
+       ar.getTransmationMatrix(result_mat);\r
 \r
        //マーカーを検出\r
-       double[][] tm;\r
        Date d2=new Date();\r
        for(int i=0;i<1000;i++){\r
            //変換行列を取得\r
            ar.detectMarkerLite(ra,100);\r
-           ar.getTransmationMatrix();\r
+           ar.getTransmationMatrix(result_mat);\r
        }\r
        Date d=new Date();\r
-       tm=null;\r
        System.out.println(d.getTime()-d2.getTime()); \r
     }\r
     public static void main(String[] args)\r
index 223ab54..28abf0e 100644 (file)
@@ -2,7 +2,6 @@ package jp.nyatla.util;
 /**\r
  * double型ポインタのエミュレートクラス\r
  * 対象のdouble配列を基点を基準に参照する。\r
- * @author atla\r
  *\r
  */\r
 public class DoublePointer\r