--- /dev/null
+ 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
+
-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
ビデオキャプチャの試験プログラム と、マーカー検出プログラムがあります。\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
クラスは関数機能毎にまとめた作りになっていますので、オリジナルの\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
\r
ではでは、楽しく遊んでくださいネ。\r
\r
-2008.05.03 R.Iizuka A虎@nyatla.jp\r
+2008.05.11 R.Iizuka A虎@nyatla.jp\r
\r
/**\r
* \r
- * @author A虎@\r
* このクラスは、Java3Dと互換性のあるNyARToolkitのラスタイメージを保持します。\r
*\r
*/\r
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
\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
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
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");
}
-
+
public void onUpdateBuffer(Buffer i_buffer)
{
try{
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);
/**\r
* simpleLiteと同じようなテストプログラム\r
- * マーカーの一致度の最低値をチェックするところを抜いたので、同じマーカーを大量に\r
- * 検出すると面白いことになります。\r
+ * 最も一致する"Hiro"マーカーを一つ選択して、その上に立方体を表示します。\r
* (c)2008 A虎@nyatla.jp\r
* airmail(at)ebony.plala.or.jp\r
* http://nyatla.jp/\r
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
//画像チェックしてマーカー探して、背景を書く\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
// 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
--- /dev/null
+/**\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
--- /dev/null
+/**\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
\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
// 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
\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
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
* [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
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
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
* 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
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
}\r
}\r
/*</Optimize>*/\r
- return;\r
+ return true;\r
}\r
}
\ No newline at end of file
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
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
* @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
} \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
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
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
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
* @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
} \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
* 返された配列のサイズを行列の大きさとして使わないこと!\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
}\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
}\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
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
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
ap_i[n]=work;//*wbp = work;\r
}\r
}\r
- return;\r
+ return true;\r
}\r
/**\r
* sourceの転置行列をdestに得る。arMatrixTrans()の代替品\r
}\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
* @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
\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
--- /dev/null
+/* \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
\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
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
* @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
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
\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
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
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
/**\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
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
\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
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
* @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
* [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
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
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
* @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
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
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
--- /dev/null
+/* \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
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
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
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
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
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
/**\r
* 320x240のBGRA32で記録されたRAWイメージから、1種類のパターンを認識し、\r
* その変換行列を1000回求め、それにかかったミリ秒時間を表示します。\r
- * \r
- * \r
- * @author R.iizuka\r
*\r
*/\r
public class RawFileTest {\r
\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
/**\r
* double型ポインタのエミュレートクラス\r
* 対象のdouble配列を基点を基準に参照する。\r
- * @author atla\r
*\r
*/\r
public class DoublePointer\r