<?xml version="1.0" encoding="UTF-8"?>\r
<classpath>\r
- <classpathentry path="" kind="src"/>\r
- <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
- <classpathentry sourcepath="/jmfapp" path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
- <classpathentry path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/j3dcore.jar" kind="lib"/>\r
- <classpathentry path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/j3dutils.jar" kind="lib"/>\r
- <classpathentry path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/vecmath.jar" kind="lib"/>\r
- <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="/NyARToolkit.utils.java3d" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="" kind="output"/>\r
+ <classpathentry kind="src" path=""/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+ <classpathentry kind="lib" path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/j3dcore.jar"/>\r
+ <classpathentry kind="lib" path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/j3dutils.jar"/>\r
+ <classpathentry kind="lib" path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/vecmath.jar"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.java3d"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+ <classpathentry kind="output" path=""/>\r
</classpath>\r
<?xml version="1.0" encoding="UTF-8"?>\r
<classpath>\r
- <classpathentry path="" kind="src"/>\r
- <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
- <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
- <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="" kind="output"/>\r
+ <classpathentry kind="src" path=""/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+ <classpathentry kind="output" path=""/>\r
</classpath>\r
<?xml version="1.0" encoding="UTF-8"?>\r
<classpath>\r
- <classpathentry path="" kind="src"/>\r
- <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
- <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
- <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="/NyARToolkit.utils.jogl" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/gluegen-rt.jar" kind="lib"/>\r
- <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/jogl.jar" kind="lib"/>\r
- <classpathentry path="" kind="output"/>\r
+ <classpathentry kind="src" path=""/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jogl"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/gluegen-rt.jar"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/jogl.jar"/>\r
+ <classpathentry kind="output" path=""/>\r
</classpath>\r
<?xml version="1.0" encoding="UTF-8"?>\r
<classpath>\r
- <classpathentry path="" kind="src"/>\r
- <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
- <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="/NyARToolkit.utils.jogl" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
- <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/jogl.jar" kind="lib"/>\r
- <classpathentry path="bin" kind="output"/>\r
+ <classpathentry kind="src" path=""/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jogl"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/jogl.jar"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+ <classpathentry kind="output" path="bin"/>\r
</classpath>\r
<?xml version="1.0" encoding="UTF-8"?>\r
<classpath>\r
- <classpathentry path="" kind="src"/>\r
- <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
- <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
- <classpathentry path="" kind="output"/>\r
+ <classpathentry kind="src" path=""/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+ <classpathentry kind="output" path=""/>\r
</classpath>\r
<?xml version="1.0" encoding="UTF-8"?>\r
<classpath>\r
- <classpathentry path="" kind="src"/>\r
- <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
- <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
- <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
- <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/gluegen-rt.jar" kind="lib"/>\r
- <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/jogl.jar" kind="lib"/>\r
- <classpathentry path="" kind="output"/>\r
+ <classpathentry kind="src" path=""/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+ <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/gluegen-rt.jar"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/jogl.jar"/>\r
+ <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+ <classpathentry kind="output" path=""/>\r
</classpath>\r
package jp.nyatla.nyartoolkit.core.labeling;\r
\r
\r
+import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.types.stack.NyObjectStack;\r
\r
/**\r
*/\r
public abstract class NyARLabelInfoStack<T extends NyARLabelInfo> extends NyObjectStack<T>\r
{\r
- public NyARLabelInfoStack(int i_length,Class<T> i_element_type)\r
+ public NyARLabelInfoStack(int i_length,Class<T> i_element_type) throws NyARException\r
{\r
super(i_length,i_element_type);\r
}\r
protected NyARLabelingLabelStack _label_list;\r
protected int[] _index_table;\r
protected boolean _is_index_table_enable;\r
- public NyARLabelingImage(int i_width, int i_height)\r
+ public NyARLabelingImage(int i_width, int i_height) throws NyARException\r
{\r
super(new NyARIntSize(i_width,i_height));\r
this._ref_buf =new int[i_height*i_width];\r
\r
\r
\r
+import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.labeling.*;\r
\r
/**\r
*/\r
public class NyARLabelingLabelStack extends NyARLabelInfoStack<NyARLabelingLabel>\r
{\r
- public NyARLabelingLabelStack(int i_max_array_size)\r
+ public NyARLabelingLabelStack(int i_max_array_size) throws NyARException\r
{\r
super(i_max_array_size,NyARLabelingLabel.class);\r
}\r
NyARLabelingLabelStack label_list = o_destination.getLabelStack();\r
\r
// ラベルバッファを予約\r
- label_list.reserv(wlabel_num);\r
+ label_list.init(wlabel_num);\r
\r
// エリアと重心、クリップ領域を計算\r
NyARLabelingLabel label_pt;\r
public long pos_x;\r
public long pos_y; \r
} \r
- public RleInfoStack(int i_length)\r
+ public RleInfoStack(int i_length) throws NyARException\r
{\r
super(i_length, RleInfoStack.RleInfo.class);\r
return;\r
private int _max_area;\r
private int _min_area;\r
\r
- public NyARLabeling_Rle(int i_width,int i_height)\r
+ public NyARLabeling_Rle(int i_width,int i_height) throws NyARException\r
{\r
this._rlestack=new RleInfoStack(i_width*i_height*2048/(320*240)+32);\r
this._rle1 = RleElement.createArray(i_width/2+1);\r
rle_current = tmp;\r
}\r
//対象のラベルだけ転写\r
- o_stack.reserv(label_count);\r
+ o_stack.init(label_count);\r
RleLabelFragmentInfoStack.RleLabelFragmentInfo[] o_dest_array=o_stack.getArray();\r
final int max=this._max_area;\r
final int min=this._min_area;\r
package jp.nyatla.nyartoolkit.core.labeling.rlelabeling;\r
\r
\r
+import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.labeling.NyARLabelInfo;\r
import jp.nyatla.nyartoolkit.core.labeling.NyARLabelInfoStack;\r
\r
//int area; // フラグメントラベルの領域数\r
public int entry_x; // フラグメントラベルの位置\r
} \r
- public RleLabelFragmentInfoStack(int i_length)\r
+ public RleLabelFragmentInfoStack(int i_length) throws NyARException\r
{\r
super(i_length, RleLabelFragmentInfoStack.RleLabelFragmentInfo.class);\r
return;\r
*/\r
public void projectionConvert(NyARDoublePoint3d i_3dvertex,NyARDoublePoint2d o_2d)\r
{\r
- o_2d.x=(i_3dvertex.x*this.m00+i_3dvertex.y*this.m01+i_3dvertex.z*this.m02)/i_3dvertex.z;\r
- o_2d.y=(i_3dvertex.y*this.m11+i_3dvertex.z*this.m12)/i_3dvertex.z;\r
+ double w=i_3dvertex.z*this.m22;\r
+ o_2d.x=(i_3dvertex.x*this.m00+i_3dvertex.y*this.m01+i_3dvertex.z*this.m02)/w;\r
+ o_2d.y=(i_3dvertex.y*this.m11+i_3dvertex.z*this.m12)/w;\r
return;\r
}\r
- \r
+ public void projectionConvert(double i_x,double i_y,double i_z,NyARDoublePoint2d o_2d)\r
+ {\r
+ double w=i_z*this.m22;\r
+ o_2d.x=(i_x*this.m00+i_y*this.m01+i_z*this.m02)/w;\r
+ o_2d.y=(i_y*this.m11+i_z*this.m12)/w;\r
+ return;\r
+ } \r
\r
\r
}\r
{\r
public NyARLinear[] line = NyARLinear.createArray(4);\r
public NyARDoublePoint2d[] sqvertex = NyARDoublePoint2d.createArray(4);\r
-// public NyARIntPoint2d[] imvertex = NyARIntPoint2d.createArray(4);\r
- public NyARSquare()\r
+ public void getCenter2d(NyARDoublePoint2d o_out)\r
{\r
- for (int i = 0; i < 4; i++)\r
- {\r
- this.line[i] = new NyARLinear();\r
- }\r
+ o_out.x=(this.sqvertex[0].x+this.sqvertex[1].x+this.sqvertex[2].x+this.sqvertex[3].x)/4;\r
+ o_out.y=(this.sqvertex[0].y+this.sqvertex[1].y+this.sqvertex[2].y+this.sqvertex[3].y)/4;\r
+ return;\r
}\r
\r
}
\ No newline at end of file
package jp.nyatla.nyartoolkit.core.squaredetect;\r
\r
\r
+import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.types.stack.NyObjectStack;\r
\r
public class NyARSquareStack extends NyObjectStack<NyARSquare>\r
{\r
- public NyARSquareStack(int i_length)\r
+ public NyARSquareStack(int i_length) throws NyARException\r
{\r
super(i_length,NyARSquare.class);\r
\r
* 格納値をベクトルとして、距離を返します。\r
* @return\r
*/\r
- public double dist()\r
+ public final double dist()\r
{\r
return Math.sqrt(this.x*this.x+this.y+this.y);\r
}\r
+ public final double sqNorm()\r
+ {\r
+ return this.x*this.x+this.y+this.y;\r
+ }\r
}\r
this.z=i_in.z;\r
return;\r
}\r
+ /**\r
+ * i_pointとのベクトルから距離を計算します。\r
+ * @return\r
+ */\r
+ public double dist(NyARDoublePoint3d i_point)\r
+ {\r
+ double x,y;\r
+ x=this.x-i_point.x;\r
+ y=this.y-i_point.y;\r
+ z=this.z-i_point.z;\r
+ return Math.sqrt(x*x+y*y+z*z);\r
+ }\r
}\r
package jp.nyatla.nyartoolkit.core.types.stack;\r
\r
\r
+import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.types.*;\r
\r
public class NyARIntPointStack extends NyObjectStack<NyARIntPoint2d>\r
{\r
- public NyARIntPointStack(int i_length)\r
+ public NyARIntPointStack(int i_length) throws NyARException\r
{\r
super(i_length,NyARIntPoint2d.class);\r
return;\r
package jp.nyatla.nyartoolkit.core.types.stack;\r
\r
\r
+import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.types.NyARIntRect;\r
\r
public class NyARIntRectStack extends NyObjectStack<NyARIntRect>\r
{\r
- public NyARIntRectStack(int i_length)\r
+ public NyARIntRectStack(int i_length) throws NyARException\r
{\r
super(i_length,NyARIntRect.class);\r
}\r
\r
\r
/**\r
- * ã\82ªã\83³ã\83\87ã\83\9eã\83³ã\83\89å\89²ã\82\8aå½\93ã\81¦ã\82\92ã\81\99ã\82\8bã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88配列。\r
+ * ã\82¹ã\82¿ã\83\83ã\82¯å\9e\8bã\81®å\8f¯å¤\89é\95·配列。\r
* 配列には実体を格納します。\r
*/\r
public abstract class NyObjectStack<T>\r
{\r
- private final static int ARRAY_APPEND_STEP = 64;\r
-\r
protected final T[] _items;\r
-\r
- private int _allocated_size;\r
-\r
protected int _length;\r
\r
/**\r
* JavaのGenedicsの制限突破\r
*/\r
@SuppressWarnings("unchecked")\r
- protected NyObjectStack(int i_length,Class<T> i_element_type)\r
+ protected NyObjectStack(int i_length,Class<T> i_element_type) throws NyARException\r
{\r
- // ポインタだけははじめに確保しておく\r
+ //領域確保\r
this._items = (T[])Array.newInstance(i_element_type, i_length);\r
- // アロケート済サイズと、使用中個数をリセット\r
- this._allocated_size = 0;\r
+ for (int i =0; i < i_length; i++){\r
+ this._items[i] =createElement();\r
+ }\r
+ //使用中個数をリセット\r
this._length = 0;\r
return;\r
}\r
protected abstract T createElement();\r
+ \r
/**\r
- * ポインタを1進めて、その要素を予約し、その要素へのポインタを返します。\r
- * 特定型に依存させるときには、継承したクラスでこの関数をオーバーライドしてください。\r
+ * 新しい領域を予約します。\r
+ * @return\r
+ * 失敗するとnull\r
+ * @throws NyARException\r
*/\r
- public final T prePush() throws NyARException\r
+ public final T prePush()\r
{\r
// 必要に応じてアロケート\r
- if (this._length >= this._allocated_size) {\r
- // 要求されたインデクスは範囲外\r
- if (this._length >= this._items.length) {\r
- throw new NyARException();\r
- }\r
- // 追加アロケート範囲を計算\r
- int range = this._length + ARRAY_APPEND_STEP;\r
- if (range >= this._items.length) {\r
- range = this._items.length;\r
- }\r
- // アロケート\r
- this.onReservRequest(this._allocated_size, range, this._items);\r
- this._allocated_size = range;\r
+ if (this._length >= this._items.length){\r
+ return null;\r
}\r
// 使用領域を+1して、予約した領域を返す。\r
T ret = this._items[this._length];\r
this._length++;\r
return ret;\r
}\r
+ /**\r
+ * スタックを初期化します。\r
+ * @param i_reserv_length\r
+ * 使用済みにするサイズ\r
+ * @return\r
+ */\r
+ public final void init(int i_reserv_length) throws NyARException\r
+ {\r
+ // 必要に応じてアロケート\r
+ if (i_reserv_length >= this._items.length){\r
+ throw new NyARException();\r
+ }\r
+ this._length=i_reserv_length;\r
+ } \r
+ \r
/** \r
- * 見かけ上の要素数を1減らして、最後尾のアイテムを返します。\r
+ * 見かけ上の要素数を1減らして、そのオブジェクトを返します。\r
+ * 返却したオブジェクトの内容は、次回のpushまで有効です。\r
* @return\r
*/\r
public final T pop()\r
* 見かけ上の要素数をi_count個減らします。\r
* @param i_count\r
* @return\r
- * NULLを返します。\r
*/\r
public final void pops(int i_count)\r
{\r
this._length-=i_count;\r
return;\r
} \r
- \r
- /**\r
- * 0~i_number_of_item-1までの領域を予約します。\r
- * 予約済の領域よりも小さい場合には、現在の長さを調整します。\r
- * @param i_number_of_reserv\r
- */\r
- final public void reserv(int i_number_of_item) throws NyARException\r
- {\r
- // 必要に応じてアロケート\r
- if (i_number_of_item >= this._allocated_size) {\r
- // 要求されたインデクスは範囲外\r
- if (i_number_of_item >= this._items.length) {\r
- throw new NyARException();\r
- }\r
- // 追加アロケート範囲を計算\r
- int range = i_number_of_item+ARRAY_APPEND_STEP;\r
- if (range >= this._items.length) {\r
- range = this._items.length;\r
- }\r
- // アロケート\r
- this.onReservRequest(this._allocated_size, range, this._items);\r
- this._allocated_size = range;\r
- }\r
- //見かけ上の配列サイズを指定\r
- this._length=i_number_of_item;\r
- return;\r
- }\r
- /**\r
- * 必要に応じて、この関数を継承先クラスで実装して下さい。\r
- * i_bufferの配列の、i_start番目からi_end-1番目までの要素に、オブジェクトを割り当てて下さい。\r
- * @param i_start\r
- * @param i_end\r
- * @param i_buffer\r
- */ \r
- final protected void onReservRequest(int i_start, int i_end, Object[] i_buffer)\r
- {\r
- try { \r
- for (int i = i_start; i < i_end; i++){\r
- i_buffer[i] =createElement();\r
- }\r
- } catch(Exception e) { \r
- e.printStackTrace(); \r
- }\r
- return;\r
- }\r
-\r
-\r
/**\r
* 配列を返します。\r
* \r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.utils;\r
+\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+public class NyARMath\r
+{\r
+ /**\r
+ * p2-p1ベクトルのsquare normを計算する。\r
+ * @param i_p1\r
+ * @param i_p2\r
+ * @return\r
+ */\r
+ public static final double sqNorm(NyARDoublePoint2d i_p1,NyARDoublePoint2d i_p2)\r
+ {\r
+ double x,y;\r
+ x=i_p2.x-i_p1.x;\r
+ y=i_p2.y-i_p1.y;\r
+ return x*x+y*y;\r
+ }\r
+ public static final double sqNorm(double i_p1x,double i_p1y,double i_p2x,double i_p2y)\r
+ {\r
+ double x,y;\r
+ x=i_p2x-i_p1x;\r
+ y=i_p2y-i_p1y;\r
+ return x*x+y*y;\r
+ }\r
+ /**\r
+ * p2-p1ベクトルのsquare normを計算する。\r
+ * @param i_p1\r
+ * @param i_p2\r
+ * @return\r
+ */ \r
+ public static final double sqNorm(NyARDoublePoint3d i_p1,NyARDoublePoint3d i_p2)\r
+ {\r
+ double x,y,z;\r
+ x=i_p2.x-i_p1.x;\r
+ y=i_p2.y-i_p1.y;\r
+ z=i_p2.z-i_p1.z;\r
+ return x*x+y*y+z*z;\r
+ }\r
+\r
+\r
+}\r
\r
class NyARDetectMarkerResultStack extends NyObjectStack<NyARDetectMarkerResult>\r
{\r
- public NyARDetectMarkerResultStack(int i_length)\r
+ public NyARDetectMarkerResultStack(int i_length) throws NyARException\r
{\r
super(i_length,NyARDetectMarkerResult.class);\r
return;\r
--- /dev/null
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.types.stack.NyObjectStack;\r
+\r
+public class IntRectStack extends NyObjectStack<NyARIntRect>\r
+{\r
+ protected NyARIntRect createElement()\r
+ {\r
+ return new NyARIntRect();\r
+ } \r
+ public IntRectStack(int i_length) throws NyARException\r
+ {\r
+ super(i_length,NyARIntRect.class);\r
+ return;\r
+ }\r
+ \r
+}
\ No newline at end of file
--- /dev/null
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.transmat.*;\r
+\r
+\r
+\r
+public class MarkerPositionTable extends NyARDataTable<MarkerPositionTable.Item>\r
+{\r
+ public static class Item\r
+ {\r
+ public boolean is_empty=true;\r
+ public NyARDoublePoint3d angle=new NyARDoublePoint3d();\r
+ public NyARDoublePoint3d trans=new NyARDoublePoint3d();\r
+ public NyARRectOffset offset=new NyARRectOffset();\r
+ public int life=0;\r
+ public NyARDoublePoint3d velocity=new NyARDoublePoint3d();\r
+ public NyARDoublePoint3d acceleration=new NyARDoublePoint3d();\r
+ public int sirial;\r
+\r
+ }\r
+ public MarkerPositionTable(int i_size)\r
+ {\r
+ this.initTable(i_size,Item.class);\r
+ this.clear();\r
+ return;\r
+ }\r
+ /**\r
+ * 空のアイテムを1個選択します。\r
+ * @return\r
+ */\r
+ public Item selectEmptyItem()\r
+ {\r
+ for(int i=this._items.length-1;i>=0;i--)\r
+ {\r
+ if(this._items[i].is_empty){\r
+ return this._items[i];\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+ protected Item createElement()\r
+ {\r
+ return new Item();\r
+ }\r
+ \r
+ public void clear()\r
+ {\r
+ for(int i=this._items.length-1;i>=0;i--)\r
+ {\r
+ if(!this._items[i].is_empty){\r
+ this._items[i].is_empty=true;\r
+ }else{\r
+ //nothing.\r
+ }\r
+ }\r
+ }\r
+ \r
+}\r
+\r
+\r
--- /dev/null
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;\r
+import jp.nyatla.nyartoolkit.core.transmat.*;\r
+import jp.nyatla.nyartoolkit.core.param.*;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.utils.NyARMath;\r
+\r
+/**\r
+ * マーカ位置の更新オペレータ。\r
+ * \r
+ *\r
+ */\r
+public class MarkerTableOperator\r
+{\r
+ NyARTransMatResult _tmp_trans_result;\r
+ INyARTransMat _transmat;\r
+ private int _sirial;\r
+ \r
+ public MarkerTableOperator(NyARParam i_ref_param) throws NyARException\r
+ {\r
+ this._transmat=new NyARTransMat(i_ref_param);\r
+ this._tmp_trans_result=new NyARTransMatResult();\r
+ this._sirial=0;\r
+ return;\r
+ }\r
+ /**\r
+ * o_itemのアイテムを更新します。\r
+ * @param i_pkindex\r
+ * @param i_marker\r
+ */\r
+ public void updateMarker(MarkerPositionTable.Item io_item,NyARSquare i_square) throws NyARException\r
+ {\r
+ NyARTransMatResult trans_result=this._tmp_trans_result;\r
+ this._transmat.transMat(i_square,io_item.offset, trans_result);\r
+ trans_result.getZXYAngle(io_item.angle);\r
+ //位置を計算(ここでEstimate?)\r
+ double x,y,z;\r
+ x=trans_result.m03;\r
+ y=trans_result.m13;\r
+ z=trans_result.m23;\r
+ //速度を計算\r
+/* double vx,vy,vz;\r
+ vx=x-io_item.trans.x;\r
+ vy=y-io_item.trans.y;\r
+ vz=z-io_item.trans.z;\r
+ //現在の加速度を計算して保存\r
+ io_item.acceleration.x=vx-io_item.velocity.x;\r
+ io_item.acceleration.y=vy-io_item.velocity.y;\r
+ io_item.acceleration.z=vz-io_item.velocity.z;\r
+ //現在の速度を計算して保存\r
+ io_item.velocity.x=vx;\r
+ io_item.velocity.y=vy;\r
+ io_item.velocity.z=vz; */\r
+ //現在の位置を計算して保存\r
+ io_item.trans.x=x;\r
+ io_item.trans.y=y;\r
+ io_item.trans.z=z;\r
+ io_item.life=0;\r
+// System.out.println("---");\r
+// System.out.println(io_item.acceleration.x+","+io_item.acceleration.y+","+io_item.acceleration.z);\r
+// System.out.println(io_item.velocity.x+","+io_item.velocity.y+","+io_item.velocity.z);\r
+// System.out.println(io_item.trans.x+","+io_item.trans.y+","+io_item.trans.z);\r
+ return;\r
+ }\r
+ /**\r
+ * 新しいマーカをテーブルに加えます。\r
+ * @param i_table\r
+ * @param i_square\r
+ * @param i_width\r
+ * @return\r
+ * @throws NyARException\r
+ */\r
+ public boolean insertMarker(MarkerPositionTable i_table,NyARSquare i_square,double i_width) throws NyARException\r
+ {\r
+ MarkerPositionTable.Item item=i_table.selectEmptyItem();\r
+ if(item==null){\r
+ return false;\r
+ }\r
+ NyARTransMatResult trans_result=this._tmp_trans_result;\r
+ item.offset.setSquare(i_width);\r
+ this._transmat.transMat(i_square,item.offset, trans_result);\r
+ trans_result.getZXYAngle(item.angle);\r
+ item.is_empty=false;\r
+ //現在の行列を保存\r
+ item.trans.x=trans_result.m03;\r
+ item.trans.y=trans_result.m13;\r
+ item.trans.z=trans_result.m23;\r
+ item.offset.setSquare(i_width);\r
+ item.life=0;\r
+ item.sirial=this._sirial;\r
+ this._sirial++;\r
+ return true;\r
+ }\r
+ /**\r
+ * 3次元空間の指定点の一番近くにあるアイテムを探します。\r
+ * @param i_table\r
+ * @param i_pos\r
+ * 探索点\r
+ * @param i_limit_max\r
+ * 探索範囲の最大値\r
+ * @return\r
+ */\r
+ public MarkerPositionTable.Item selectNearItem3d(MarkerPositionTable i_table,NyARDoublePoint3d i_pos,double i_limit_max)\r
+ {\r
+ MarkerPositionTable.Item[] items=i_table.selectAllItems();\r
+ double d=Double.MAX_VALUE;\r
+ int index=-1;\r
+ final double limit=3*(i_limit_max*i_limit_max);\r
+ \r
+ for(int i=items.length-1;i>=0;i--)\r
+ {\r
+ if(items[i].is_empty){\r
+ continue;\r
+ }\r
+ \r
+ NyARDoublePoint3d trans=items[i].trans;\r
+ //distの計算\r
+ double nd=NyARMath.sqNorm(i_pos, trans);\r
+ if(nd>limit){\r
+ continue;\r
+ }\r
+ if(d>nd){\r
+ d=nd;\r
+ index=i;\r
+ }\r
+ }\r
+ return index==-1?null:items[index];\r
+ }\r
+// private NyARDoublePoint3d _area_temp=new NyARDoublePoint3d();\r
+ /**\r
+ * 2次元空間の指定点の一番近くにあるアイテムを探します。\r
+ * @param i_table\r
+ * @param i_pos\r
+ * 探索点\r
+ * @param i_limit_max\r
+ * 探索範囲の最大値\r
+ * @return\r
+ *//*\r
+ public MarkerPositionTable.Item selectNearItem2d(MarkerPositionTable i_table,NyARDoublePoint2d i_pos,double i_limit_max,int i_limit_min_life)\r
+ {\r
+ MarkerPositionTable.Item[] items=i_table.selectAllItems();\r
+ \r
+ double d=Double.MAX_VALUE;\r
+ NyARPerspectiveProjectionMatrix prjmat=this._prjmat;\r
+ NyARDoublePoint2d pos2d=this._pos2d_tmp;\r
+ //エリア\r
+ NyARDoublePoint3d area=this._area_temp;\r
+ area.x=area.y=i_limit_max;\r
+ int index=-1;\r
+ for(int i=items.length-1;i>=0;i--)\r
+ {\r
+ if(items[i].is_empty || items[i].life<i_limit_min_life){\r
+ continue;\r
+ }\r
+ NyARDoublePoint3d trans=items[i].trans;\r
+ //pos2dに中心座標を計算\r
+ prjmat.projectionConvert(trans,pos2d);\r
+ //2点間の距離^2を計算\r
+ double x,y;\r
+ x=pos2d.x-i_pos.x;\r
+ y=pos2d.y-i_pos.y;\r
+ double nd=(x*x)+(y*y);\r
+ \r
+ //有効距離を計算\r
+ area.z=trans.z;\r
+ prjmat.projectionConvert(area,pos2d);\r
+ x=pos2d.x-this._prjmat.m02;\r
+ y=pos2d.y-this._prjmat.m12;\r
+ double limit_d=x*x+y*y;\r
+ \r
+ //有効範囲内?\r
+ if(nd>limit_d){\r
+ continue;\r
+ }\r
+ if(d>nd){\r
+ d=nd;\r
+ index=i;\r
+ }\r
+ }\r
+ return index==-1?null:items[index];\r
+ }*/\r
+ \r
+ /**\r
+ * テーブルの全行を1ティック進めます。\r
+ * @param i_table\r
+ */\r
+ public void updateTick(MarkerPositionTable i_table)\r
+ {\r
+ MarkerPositionTable.Item[] items=i_table.selectAllItems();\r
+ for(int i=items.length-1;i>=0;i--)\r
+ {\r
+ final MarkerPositionTable.Item item=items[i];\r
+ if(item.is_empty){\r
+ continue;\r
+ }\r
+ if(item.life<10){\r
+ item.life++;\r
+ continue;\r
+ }\r
+ item.is_empty=true;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.NyARCode;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.Coord2Linear;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.INyARSquareContourDetector;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.types.matrix.NyARDoubleMatrix33;\r
+import jp.nyatla.nyartoolkit.core.transmat.*;\r
+import jp.nyatla.nyartoolkit.core.utils.NyARMath;\r
+import jp.nyatla.nyartoolkit.core.match.NyARMatchPattDeviationColorData;\r
+import jp.nyatla.nyartoolkit.core.match.NyARMatchPattResult;\r
+import jp.nyatla.nyartoolkit.core.match.NyARMatchPatt_Color_WITHOUT_PCA;\r
+import jp.nyatla.nyartoolkit.core.param.INyARCameraDistortionFactor;\r
+import jp.nyatla.nyartoolkit.core.param.NyARParam;\r
+import jp.nyatla.nyartoolkit.core.param.NyARPerspectiveProjectionMatrix;\r
+import jp.nyatla.nyartoolkit.core.pickup.INyARColorPatt;\r
+import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;\r
+import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.INyARRasterFilter_RgbToBin;\r
+\r
+\r
+\r
+public class MarkerTracking_3dTrans\r
+{\r
+ /**\r
+ * detectMarkerのコールバック関数\r
+ */\r
+ private class DetectSquareCB implements INyARSquareContourDetector.DetectMarkerCallback\r
+ {\r
+ //公開プロパティ\r
+ public NyARSquare square=new NyARSquare();\r
+ public final MarkerPositionTable table;\r
+ public final MarkerTableOperator table_operator;\r
+ public NextFrameMarkerStack _nextframe;\r
+ private double _marker_width;\r
+ \r
+ //参照インスタンス\r
+ private INyARRgbRaster _ref_raster;\r
+ //所有インスタンス\r
+ private INyARColorPatt _inst_patt;\r
+ private NyARMatchPattDeviationColorData _deviation_data;\r
+ private NyARMatchPatt_Color_WITHOUT_PCA _match_patt;\r
+ private final NyARMatchPattResult __detectMarkerLite_mr=new NyARMatchPattResult();\r
+ private Coord2Linear _coordline;\r
+ \r
+ private NyARPerspectiveProjectionMatrix _prjmat;\r
+ private INyARCameraDistortionFactor _dist;\r
+ public DetectSquareCB(INyARColorPatt i_inst_patt,NyARCode i_ref_code,NyARParam i_param,double i_marker_width) throws NyARException\r
+ {\r
+ this.table_operator=new MarkerTableOperator(i_param);\r
+ this.table=new MarkerPositionTable(10);\r
+ this._nextframe=new NextFrameMarkerStack(10);\r
+ this._marker_width=i_marker_width;\r
+\r
+ \r
+ this._prjmat=i_param.getPerspectiveProjectionMatrix();\r
+ this._dist=i_param.getDistortionFactor();\r
+ \r
+ //\r
+ this._inst_patt=i_inst_patt;\r
+ this._deviation_data=new NyARMatchPattDeviationColorData(i_ref_code.getWidth(),i_ref_code.getHeight());\r
+ this._coordline=new Coord2Linear(i_param.getScreenSize(),i_param.getDistortionFactor());\r
+ this._match_patt=new NyARMatchPatt_Color_WITHOUT_PCA(i_ref_code);\r
+ return;\r
+ }\r
+ private NyARIntPoint2d[] __tmp_vertex=NyARIntPoint2d.createArray(4);\r
+ private NyARDoublePoint2d __tmp_point=new NyARDoublePoint2d();\r
+ /**\r
+ * 矩形が見付かるたびに呼び出されます。\r
+ * 発見した矩形のパターンを検査して、方位を考慮した頂点データを確保します。\r
+ */\r
+ public void onSquareDetect(INyARSquareContourDetector i_sender,int[] i_coordx,int[] i_coordy,int i_coor_num,int[] i_vertex_index) throws NyARException\r
+ {\r
+ //輪郭座標から頂点リストに変換\r
+ NyARIntPoint2d[] vertex=this.__tmp_vertex;\r
+ vertex[0].x=i_coordx[i_vertex_index[0]];\r
+ vertex[0].y=i_coordy[i_vertex_index[0]];\r
+ vertex[1].x=i_coordx[i_vertex_index[1]];\r
+ vertex[1].y=i_coordy[i_vertex_index[1]];\r
+ vertex[2].x=i_coordx[i_vertex_index[2]];\r
+ vertex[2].y=i_coordy[i_vertex_index[2]];\r
+ vertex[3].x=i_coordx[i_vertex_index[3]];\r
+ vertex[3].y=i_coordy[i_vertex_index[3]];\r
+ \r
+ //マーカ中心を計算\r
+ NyARDoublePoint2d new_center=this.__tmp_point;\r
+ new_center.x=(vertex[0].x+vertex[1].x+vertex[2].x+vertex[3].x)/4;\r
+ new_center.y=(vertex[0].y+vertex[1].y+vertex[2].y+vertex[3].y)/4;\r
+ //近所のマーカを探す。[Optimize:重複計算あり]\r
+ NextFrameMarkerStack.Item near_item=this.getNearItem(new_center);//[Optimize]見つけた矩形はリストから削除すべきだよね。\r
+ if(near_item==null){\r
+ //このマーカは未登録\r
+ NyARMatchPattResult mr=this.__detectMarkerLite_mr;\r
+ \r
+ //画像を取得\r
+ if (!this._inst_patt.pickFromRaster(this._ref_raster,vertex)){\r
+ return;\r
+ }\r
+ //取得パターンをカラー差分データに変換して評価する。\r
+ this._deviation_data.setRaster(this._inst_patt);\r
+ if(!this._match_patt.evaluate(this._deviation_data,mr)){\r
+ return;\r
+ }\r
+ //現在の一致率より低ければ終了\r
+ if (0.5 > mr.confidence){\r
+ return;\r
+ }\r
+ //一致率の高い矩形があれば、方位を考慮して頂点情報を作成\r
+ NyARSquare sq=this.square;\r
+ //directionを考慮して、squareを更新する。\r
+ for(int i=0;i<4;i++){\r
+ int idx=(i+4 - mr.direction) % 4;\r
+ this._coordline.coord2Line(i_vertex_index[idx],i_vertex_index[(idx+1)%4],i_coordx,i_coordy,i_coor_num,sq.line[i]);\r
+ }\r
+ for (int i = 0; i < 4; i++) {\r
+ //直線同士の交点計算\r
+ if(!NyARLinear.crossPos(sq.line[i],sq.line[(i + 3) % 4],sq.sqvertex[i])){\r
+ throw new NyARException();//ここのエラー復帰するならダブルバッファにすればOK\r
+ }\r
+ }\r
+ System.out.println("D:"+mr.direction);\r
+ //テーブルにマーカ情報を追加する。\r
+ this.table_operator.insertMarker(this.table,sq,this._marker_width); \r
+\r
+ }else{\r
+ //このマーカは登録済。\r
+ MarkerPositionTable.Item item=this.table.selectItem(near_item.oid);\r
+ //予想基準頂点に一番近い観測頂点インデクスを得る。\r
+ int dir=getNearVertexIndex(near_item.vertex0,near_item.center,vertex,new_center);\r
+\r
+ //一致率の高い矩形があれば、方位を考慮して頂点情報を作成\r
+ NyARSquare sq=this.square;\r
+ //directionを考慮して、squareを更新する。\r
+ for(int i=0;i<4;i++){\r
+ int idx=(i+dir) % 4;\r
+ this._coordline.coord2Line(i_vertex_index[idx],i_vertex_index[(idx+1)%4],i_coordx,i_coordy,i_coor_num,sq.line[i]);\r
+ }\r
+ for (int i = 0; i < 4; i++) {\r
+ //直線同士の交点計算\r
+ if(!NyARLinear.crossPos(sq.line[i],sq.line[(i + 3) % 4],sq.sqvertex[i])){\r
+ throw new NyARException();//ここのエラー復帰するならダブルバッファにすればOK\r
+ }\r
+ }\r
+ this.table_operator.updateMarker(item,sq);\r
+ }\r
+ }\r
+ private int getNearVertexIndex(NyARDoublePoint2d i_base_vertex,NyARDoublePoint2d i_base_center,NyARIntPoint2d[] i_sq,NyARDoublePoint2d i_sqcenter)\r
+ {\r
+ double bx,by;\r
+ //観察座標の中央位置からのベクトル\r
+ bx=i_base_vertex.x-i_sqcenter.x;\r
+ by=i_base_vertex.y-i_sqcenter.y;\r
+\r
+ //一番近い頂点を探す.\r
+ double d=NyARMath.sqNorm(bx,by,i_sq[3].x-i_sqcenter.x,i_sq[3].y-i_sqcenter.y);\r
+ int ret=3;\r
+ for(int i=2;i>=0;i--)\r
+ {\r
+ //予測座標の中央位置からのベクトルの長さを計算\r
+ double d2=NyARMath.sqNorm(bx,by,i_sq[i].x-i_sqcenter.x,i_sq[i].y-i_sqcenter.y);\r
+ if(d2<d){\r
+ d=d2;\r
+ ret=i;\r
+ }\r
+ }\r
+ return ret;\r
+ }\r
+ NyARDoubleMatrix33 _rot_temp=new NyARDoubleMatrix33();\r
+ private NyARDoublePoint3d _pos3d_tmp=new NyARDoublePoint3d();\r
+ private NyARDoublePoint3d _area_temp=new NyARDoublePoint3d();\r
+ private NyARDoublePoint2d _pos2d_tmp=new NyARDoublePoint2d();\r
+ \r
+ public final void init(INyARRgbRaster i_raster)\r
+ { \r
+ this._ref_raster=i_raster;\r
+ //マーカの予測位置を計算しておく\r
+ NextFrameMarkerStack stack=this._nextframe;\r
+ NyARDoublePoint2d pos2d=this._pos2d_tmp;\r
+ NyARDoublePoint3d pos3d=this._pos3d_tmp;\r
+ \r
+ NyARPerspectiveProjectionMatrix prjmat=this._prjmat;\r
+ INyARCameraDistortionFactor dist=this._dist;\r
+ MarkerPositionTable.Item[] items=this.table.selectAllItems();\r
+\r
+ NyARDoubleMatrix33 rot=this._rot_temp;\r
+ \r
+ NyARDoublePoint3d area=this._area_temp;\r
+ area.x=area.y=this._marker_width;\r
+ stack.clear();\r
+ for(int i=items.length-1;i>=0;i--)\r
+ {\r
+ if(items[i].is_empty){\r
+ continue;\r
+ }\r
+ final NyARDoublePoint3d trans=items[i].trans;\r
+ //pos2dに中心座標を計算\r
+ NextFrameMarkerStack.Item item=stack.prePush();\r
+ item.oid=i;\r
+ prjmat.projectionConvert(trans,item.center);//[Optimaize!]\r
+ dist.ideal2Observ(item.center, item.center);\r
+ //方位決定のためにvertex0の計算[optimize! ここの計算関数すれば早くなる。]\r
+ final NyARDoublePoint3d offset=items[i].offset.vertex[0];\r
+ rot.setZXYAngle(items[i].angle);\r
+ rot.transformVertex(offset,pos3d);\r
+ prjmat.projectionConvert(trans.x+pos3d.x,trans.y+pos3d.y,trans.z+pos3d.z,item.vertex0);//[Optimaize!]\r
+ dist.ideal2Observ(item.vertex0, item.vertex0);\r
+ //探索範囲の計算\r
+ area.z=trans.z;\r
+ prjmat.projectionConvert(area,pos2d);//[Optimaize!]\r
+ dist.ideal2Observ(pos2d,pos2d);\r
+ item.dist=NyARMath.sqNorm(pos2d.x,pos2d.y,this._prjmat.m02,this._prjmat.m12)/2;\r
+ }\r
+ return;\r
+ }\r
+ \r
+ \r
+ \r
+ /**\r
+ * 2次元空間の指定点の一番近くにあるアイテムを探します。\r
+ * @param i_table\r
+ * @param i_pos\r
+ * 探索点\r
+ * @param i_limit_max\r
+ * 探索範囲の最大値\r
+ * @return\r
+ */\r
+ public NextFrameMarkerStack.Item getNearItem(NyARDoublePoint2d i_pos)\r
+ {\r
+ NextFrameMarkerStack.Item[] items=this._nextframe.getArray();\r
+ \r
+ double d=Double.MAX_VALUE;\r
+ //エリア\r
+ int index=-1;\r
+ for(int i=this._nextframe.getLength()-1;i>=0;i--)\r
+ {\r
+ NyARDoublePoint2d center=items[i].center;\r
+ double nd=NyARMath.sqNorm(i_pos, center);\r
+ //有効範囲内?\r
+ if(nd>items[i].dist){\r
+ continue;\r
+ }\r
+ if(d>nd){\r
+ d=nd;\r
+ index=i;\r
+ }\r
+ }\r
+ return index==-1?null:items[index];\r
+ } \r
+ }\r
+ private INyARSquareContourDetector _square_detect;\r
+ protected INyARTransMat _transmat;\r
+ //画処理用\r
+ private NyARBinRaster _bin_raster;\r
+ protected INyARRasterFilter_RgbToBin _tobin_filter;\r
+ private DetectSquareCB _detect_cb;\r
+ \r
+ public IntRectStack _next_marker;\r
+ public TransMat2MarkerRect _estimator;\r
+\r
+\r
+ protected MarkerTracking_3dTrans()\r
+ {\r
+ return;\r
+ }\r
+ protected void initInstance(\r
+ INyARColorPatt i_patt_inst,\r
+ INyARSquareContourDetector i_sqdetect_inst,\r
+ INyARTransMat i_transmat_inst,\r
+ INyARRasterFilter_RgbToBin i_filter,\r
+ NyARParam i_ref_param,\r
+ NyARCode i_ref_code,\r
+ double i_marker_width) throws NyARException\r
+ {\r
+ final NyARIntSize scr_size=i_ref_param.getScreenSize(); \r
+ // 解析オブジェクトを作る\r
+ this._square_detect = i_sqdetect_inst;\r
+ this._transmat = i_transmat_inst;\r
+ this._tobin_filter=i_filter;\r
+ // 比較コードを保存\r
+ //2値画像バッファを作る\r
+ this._bin_raster=new NyARBinRaster(scr_size.w,scr_size.h);\r
+ //_detect_cb\r
+ this._detect_cb=new DetectSquareCB(i_patt_inst,i_ref_code,i_ref_param,i_marker_width);\r
+ this._next_marker=new IntRectStack(10);\r
+ this._estimator=new TransMat2MarkerRect(i_ref_param);\r
+ return;\r
+ }\r
+ /**\r
+ * i_imageにマーカー検出処理を実行し、結果を記録します。\r
+ * \r
+ * @param i_raster\r
+ * マーカーを検出するイメージを指定します。イメージサイズは、カメラパラメータ\r
+ * と一致していなければなりません。\r
+ * @return マーカーが検出できたかを真偽値で返します。\r
+ * @throws NyARException\r
+ */\r
+ public int detectMarkerLite(INyARRgbRaster i_raster) throws NyARException\r
+ {\r
+ //サイズチェック\r
+ if(!this._bin_raster.getSize().isEqualSize(i_raster.getSize())){\r
+ throw new NyARException();\r
+ }\r
+\r
+ //ラスタを2値イメージに変換する.\r
+ this._tobin_filter.doFilter(i_raster,this._bin_raster);\r
+\r
+ //コールバックハンドラの準備\r
+ this._detect_cb.init(i_raster);\r
+ //矩形を探す(戻り値はコールバック関数で受け取る。)\r
+ this._square_detect.detectMarkerCB(this._bin_raster,_detect_cb);\r
+ //時間を進める。\r
+ this._detect_cb.table_operator.updateTick(this._detect_cb.table);\r
+ \r
+ //矩形位置の予想\r
+ this._next_marker.clear();\r
+ this._estimator.convert(this._detect_cb.table.selectAllItems(), this._next_marker);\r
+ return -1;\r
+ }\r
+ public Object[] _probe()\r
+ {\r
+ Object[] ret=new Object[10];\r
+ ret[0]=this._detect_cb.table;\r
+ ret[1]=this._next_marker;\r
+ ret[2]=this._detect_cb._nextframe;\r
+ return ret;\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.types.stack.NyObjectStack;\r
+\r
+public class NextFrameMarkerStack extends NyObjectStack<NextFrameMarkerStack.Item>\r
+{\r
+ public class Item\r
+ {\r
+ public int oid;\r
+ public NyARDoublePoint2d center=new NyARDoublePoint2d();\r
+ public NyARDoublePoint2d vertex0=new NyARDoublePoint2d();\r
+ /**\r
+ * 探索距離\r
+ */\r
+ public double dist;\r
+ \r
+ \r
+ }\r
+ protected NextFrameMarkerStack.Item createElement()\r
+ {\r
+ return new NextFrameMarkerStack.Item();\r
+ } \r
+ public NextFrameMarkerStack(int i_length) throws NyARException\r
+ {\r
+ super(i_length,NextFrameMarkerStack.Item.class);\r
+ return;\r
+ }\r
+ \r
+}
\ No newline at end of file
--- /dev/null
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import java.lang.reflect.Array;\r
+\r
+public abstract class NyARDataTable<TItem extends Object>\r
+{\r
+ protected TItem[] _items;\r
+ /**\r
+ * アイテムすべてを選択します。\r
+ * @return\r
+ */\r
+ public final TItem[] selectAllItems()\r
+ {\r
+ return this._items;\r
+ }\r
+ public final TItem selectItem(int i_oid)\r
+ {\r
+ return this._items[i_oid];\r
+ }\r
+ @SuppressWarnings("unchecked")\r
+ protected void initTable(int i_size,Class<TItem> i_elemtype)\r
+ {\r
+ this._items=(TItem[])Array.newInstance(i_elemtype, i_size);\r
+ for(int i=0;i<i_size;i++){\r
+ this._items[i]=createElement();\r
+ }\r
+ return;\r
+ }\r
+ protected abstract TItem createElement(); \r
+}
\ No newline at end of file
--- /dev/null
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import java.awt.*;\r
+import java.awt.color.*;\r
+import java.awt.event.*;\r
+import java.awt.image.*;\r
+import java.io.*;\r
+import javax.media.Buffer;\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.NyARCode;\r
+import jp.nyatla.nyartoolkit.core.param.NyARParam;\r
+import jp.nyatla.nyartoolkit.core.pickup.INyARColorPatt;\r
+import jp.nyatla.nyartoolkit.core.pickup.NyARColorPatt_Perspective_O2;\r
+import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.INyARSquareContourDetector;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector_Rle;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareStack;\r
+import jp.nyatla.nyartoolkit.core.transmat.INyARTransMat;\r
+import jp.nyatla.nyartoolkit.core.transmat.NyARTransMat;\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureDevice;\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureDeviceList;\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener;\r
+import jp.nyatla.nyartoolkit.jogl.utils.GLNyARRaster_RGB;\r
+import jp.nyatla.nyartoolkit.utils.j2se.NyARRasterImageIO;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+\r
+/**\r
+ * @todo\r
+ * 矩形の追跡は動いてるから、位置予測機能と組み合わせて試すこと。\r
+ *\r
+ */\r
+class Tracking extends MarkerTracking_3dTrans\r
+{\r
+ Tracking(NyARParam i_param,NyARCode i_code,double i_marker_width,int i_input_raster_type) throws NyARException\r
+ {\r
+ super();\r
+ initInstance(\r
+ new NyARColorPatt_Perspective_O2(i_code.getWidth(), i_code.getHeight(),4,25),\r
+ new NyARSquareContourDetector_Rle(i_param.getDistortionFactor(),i_param.getScreenSize()),\r
+ new NyARTransMat(i_param),\r
+ new NyARRasterFilter_ARToolkitThreshold(120,i_input_raster_type),\r
+ i_param,\r
+ i_code,\r
+ i_marker_width);\r
+ }\r
+}\r
+\r
+public class TrTest extends Frame implements JmfCaptureListener,MouseMotionListener\r
+{\r
+\r
+\r
+ private final String PARAM_FILE = "../Data/camera_para.dat";\r
+\r
+ private final static String CARCODE_FILE = "../Data/patt.hiro";\r
+\r
+ private static final long serialVersionUID = -2110888320986446576L;\r
+\r
+ private JmfCaptureDevice _capture;\r
+\r
+ private GLNyARRaster_RGB _capraster;\r
+\r
+ private int W = 320;\r
+\r
+ private int H = 240;\r
+\r
+ private Tracking _tr;\r
+ TransMat2MarkerRect _trm;\r
+\r
+ public TrTest() throws NyARException\r
+ {\r
+ setTitle("JmfCaptureTest");\r
+ Insets ins = this.getInsets();\r
+ this.setSize(1024 + ins.left + ins.right, 768 + ins.top + ins.bottom);\r
+ JmfCaptureDeviceList dl = new JmfCaptureDeviceList();\r
+ this._capture = dl.getDevice(0);\r
+ if (!this._capture.setCaptureFormat(JmfCaptureDevice.PIXEL_FORMAT_RGB, W, H, 30.0f)) {\r
+ if (!this._capture.setCaptureFormat(JmfCaptureDevice.PIXEL_FORMAT_YUV, W, H, 30.0f)) {\r
+ throw new NyARException("キャプチャフォーマットが見つかりません。");\r
+ }\r
+ }\r
+ NyARParam ar_param = new NyARParam();\r
+ ar_param.loadARParamFromFile(PARAM_FILE);\r
+ ar_param.changeScreenSize(W, H);\r
+\r
+ NyARCode code = new NyARCode(16, 16);\r
+ code.loadARPattFromFile(CARCODE_FILE);\r
+ this._capraster = new GLNyARRaster_RGB(ar_param, this._capture.getCaptureFormat());\r
+ this._capture.setOnCapture(this);\r
+\r
+ addMouseMotionListener(this);\r
+ this._tr=new Tracking(ar_param,code,80,this._capraster.getBufferReader().getBufferType());\r
+ this._trm=new TransMat2MarkerRect(ar_param);\r
+ return;\r
+ }\r
+ int mouse_x;\r
+ int mouse_y;\r
+ public void mouseMoved(MouseEvent A00)\r
+ {\r
+ mouse_x = A00.getX();\r
+ mouse_y = A00.getY();\r
+ }\r
+\r
+ public void mouseDragged(MouseEvent A00) {}\r
+\r
+\r
+\r
+ private final String data_file = "../Data/320x240ABGR.raw";\r
+\r
+ \r
+\r
+ public void draw(GLNyARRaster_RGB i_raster)\r
+ {\r
+ try {\r
+ Insets ins = this.getInsets();\r
+ Graphics g = getGraphics();\r
+ this._tr.detectMarkerLite(i_raster);\r
+ Object[] probe=this._tr._probe();\r
+ MarkerPositionTable mpt=(MarkerPositionTable)probe[0];\r
+ NextFrameMarkerStack fs=(NextFrameMarkerStack)probe[2];\r
+ \r
+ {// ピックアップ画像の表示\r
+ // 矩形抽出\r
+// INyARRasterFilter_RgbToBin to_binfilter = NyARRasterFilterBuilder_ARToolkitThreshold.createFilter(110, i_raster.getBufferReader().getBufferType());\r
+// to_binfilter.doFilter(i_raster, this._bin_raster);\r
+// if (this.detect.detectMarkerLite(i_raster, 100)) {\r
+//\r
+// NyARTransMatResult res = new NyARTransMatResult();\r
+// this.detect.getTransmationMatrix(res);\r
+// }\r
+ {// 撮影画像\r
+ \r
+// INyARRasterFilter_RgbToBin filter=new NyARRasterFilter_ARToolkitThreshold(110,i_raster.getBufferReader().getBufferType());\r
+// NyARSquareStack stack=new NyARSquareStack(10);\r
+ \r
+ BufferedImage sink = new BufferedImage(i_raster.getWidth(), i_raster.getHeight(), ColorSpace.TYPE_RGB);\r
+\r
+ {//元画像\r
+ NyARRasterImageIO.copy(i_raster, sink);\r
+ Graphics g2=sink.getGraphics();\r
+ g2.setColor(Color.RED);\r
+ MarkerPositionTable.Item[] item=mpt.selectAllItems();\r
+ for(int i=0;i<item.length;i++){\r
+ if(item[i].is_empty){\r
+ continue;\r
+ }\r
+ NyARIntRect re=new NyARIntRect();\r
+ this._trm.convert(item[i], re);\r
+ g2.drawRect(re.x,re.y,re.w,re.h);\r
+ g2.drawString(Integer.toString(item[i].sirial),re.x,re.y);\r
+ }\r
+ g2.setColor(Color.CYAN);\r
+ for(int i=0;i<fs.getLength();i++){\r
+ g2.drawRect((int)(fs.getItem(i).vertex0.x-1),(int)(fs.getItem(i).vertex0.y-1),2,2);\r
+ }\r
+ g.drawImage(sink, ins.left, ins.top, this);\r
+ }\r
+ }\r
+\r
+ {// 信号取得テスト\r
+\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ public void onUpdateBuffer(Buffer i_buffer)\r
+ {\r
+ try {\r
+\r
+ {// ピックアップ画像の表示\r
+ // 矩形抽出\r
+ synchronized(this._capraster){\r
+ this._capraster.setBuffer(i_buffer);\r
+ draw(this._capraster);\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ public void startCapture()\r
+ {\r
+ try {\r
+ this._capture.start();\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ public void startImage()\r
+ {\r
+ try {\r
+ // 試験イメージの読み出し(320x240 BGRAのRAWデータ)\r
+ File f = new File(data_file);\r
+ FileInputStream fs = new FileInputStream(data_file);\r
+ byte[] buf = new byte[(int) f.length() * 4];\r
+ fs.read(buf);\r
+// INyARRgbRaster ra = NyARRgbRaster_BGRA.wrap(buf, W, H);\r
+// draw(ra);\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+\r
+ }\r
+\r
+ public static void main(String[] args)\r
+ {\r
+\r
+ try {\r
+ TrTest mainwin = new TrTest();\r
+ mainwin.setVisible(true);\r
+ mainwin.startCapture();\r
+ // mainwin.startImage();\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.param.*;\r
+import jp.nyatla.nyartoolkit.core.param.NyARPerspectiveProjectionMatrix;\r
+import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint2d;\r
+import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint3d;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntRect;\r
+import jp.nyatla.nyartoolkit.core.types.matrix.NyARDoubleMatrix33;\r
+\r
+/**\r
+ * tableの内容から、矩形集合を計算する。\r
+ *\r
+ */\r
+public class TransMat2MarkerRect\r
+{\r
+ private INyARCameraDistortionFactor _dist;\r
+ private NyARPerspectiveProjectionMatrix _prjmat;\r
+ private NyARDoubleMatrix33 _rot_temp=new NyARDoubleMatrix33();\r
+ private NyARDoublePoint3d _pos_temp=new NyARDoublePoint3d();\r
+ private NyARDoublePoint2d _pos2d_tmp=new NyARDoublePoint2d();\r
+ public TransMat2MarkerRect(NyARParam i_param)\r
+ {\r
+ this._dist=i_param.getDistortionFactor();\r
+ this._prjmat=i_param.getPerspectiveProjectionMatrix();\r
+ }\r
+ public int convert(MarkerPositionTable.Item[] i_positions,IntRectStack o_out) throws NyARException\r
+ {\r
+ NyARDoubleMatrix33 rot=this._rot_temp;\r
+ NyARDoublePoint3d pos=this._pos_temp;\r
+ NyARPerspectiveProjectionMatrix prjmat=this._prjmat;\r
+ NyARDoublePoint2d pos2d=this._pos2d_tmp;\r
+ INyARCameraDistortionFactor dist=_dist;\r
+ for(int i=i_positions.length-1;i>=0;i--)\r
+ {\r
+ MarkerPositionTable.Item item=i_positions[i];\r
+ //空の項目をパス\r
+ if(item.is_empty){\r
+ continue;\r
+ }\r
+ //変換行列を計算\r
+ rot.setZXYAngle(item.angle);\r
+ \r
+ //4vertexの2次元座標を計算して、それらを内包する矩形を計算する。\r
+ //[optimize]矩形予測と計算かぶってるよ。\r
+ int n;\r
+ int l,t,r,b;\r
+ int i2=4-1;\r
+ //[3]の座標変換と射影変換、歪み逆補正\r
+ rot.transformVertex(item.offset.vertex[i2], pos);\r
+ pos.x+=item.trans.x;\r
+ pos.y+=item.trans.y;\r
+ pos.z+=item.trans.z;\r
+ prjmat.projectionConvert(pos,pos2d);\r
+ dist.ideal2Observ(pos2d, pos2d);\r
+ l=r=(int)pos2d.x;\r
+ t=b=(int)pos2d.y;\r
+ i2--;\r
+ for(;i2>=0;i2--){\r
+ //[i2]の座標変換と射影変換、歪み逆補正\r
+ rot.transformVertex(item.offset.vertex[i2], pos);\r
+ pos.x+=item.trans.x;\r
+ pos.y+=item.trans.y;\r
+ pos.z+=item.trans.z;\r
+ prjmat.projectionConvert(pos,pos2d);\r
+ dist.ideal2Observ(pos2d, pos2d);\r
+ n=(int)pos2d.x;\r
+ if(l>n){\r
+ l=n;\r
+ }else if(r<n){\r
+ r=n;\r
+ }\r
+ n=(int)pos2d.y;\r
+ if(t>n){\r
+ t=n;\r
+ }else if(b<n){\r
+ b=n;\r
+ }\r
+ } \r
+ //RECT保存\r
+ NyARIntRect rect=o_out.prePush();\r
+ rect.x=l;\r
+ rect.y=t;\r
+ rect.w=r-l;\r
+ rect.h=b-t;\r
+ }\r
+ return 0;\r
+ }\r
+ public void convert(MarkerPositionTable.Item i_positions,NyARIntRect o_rect) throws NyARException\r
+ {\r
+ NyARDoubleMatrix33 rot=this._rot_temp;\r
+ NyARDoublePoint3d pos=this._pos_temp;\r
+ NyARPerspectiveProjectionMatrix prjmat=this._prjmat;\r
+ NyARDoublePoint2d pos2d=this._pos2d_tmp;\r
+ INyARCameraDistortionFactor dist=_dist;\r
+\r
+ //変換行列を計算\r
+ rot.setZXYAngle(i_positions.angle);\r
+ \r
+ //4vertexの2次元座標を計算して、それらを内包する矩形を計算する。\r
+ int n;\r
+ int l,t,r,b;\r
+ int i2=4-1;\r
+ //[3]の座標変換と射影変換、歪み逆補正\r
+ rot.transformVertex(i_positions.offset.vertex[i2], pos);\r
+ pos.x+=i_positions.trans.x;\r
+ pos.y+=i_positions.trans.y;\r
+ pos.z+=i_positions.trans.z;\r
+ prjmat.projectionConvert(pos,pos2d);\r
+ dist.ideal2Observ(pos2d, pos2d);\r
+ l=r=(int)pos2d.x;\r
+ t=b=(int)pos2d.y;\r
+ i2--;\r
+ for(;i2>=0;i2--){\r
+ //[i2]の座標変換と射影変換、歪み逆補正\r
+ rot.transformVertex(i_positions.offset.vertex[i2], pos);\r
+ pos.x+=i_positions.trans.x;\r
+ pos.y+=i_positions.trans.y;\r
+ pos.z+=i_positions.trans.z;\r
+ prjmat.projectionConvert(pos,pos2d);\r
+ dist.ideal2Observ(pos2d, pos2d);\r
+ n=(int)pos2d.x;\r
+ if(l>n){\r
+ l=n;\r
+ }else if(r<n){\r
+ r=n;\r
+ }\r
+ n=(int)pos2d.y;\r
+ if(t>n){\r
+ t=n;\r
+ }else if(b<n){\r
+ b=n;\r
+ }\r
+ } \r
+ //RECT保存\r
+ o_rect.x=l;\r
+ o_rect.y=t;\r
+ o_rect.w=r-l;\r
+ o_rect.h=b-t;\r
+ } \r
+}
\ No newline at end of file