--- /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 edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program. If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ * http://nyatla.jp/nyatoolkit/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.core.raster;\r
+\r
+import jp.nyatla.nyartoolkit.core.rasterreader.INyARBufferReader;\r
+import jp.nyatla.nyartoolkit.core.rasterreader.NyARBufferReader;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+\r
+public final class NyARHsvRaster extends NyARRaster_BasicClass\r
+{\r
+\r
+ protected int[] _ref_buf;\r
+ private INyARBufferReader _buffer_reader;\r
+ \r
+ public NyARHsvRaster(int i_width, int i_height)\r
+ {\r
+ super(new NyARIntSize(i_width,i_height));\r
+ this._ref_buf = new int[i_height*i_width];\r
+ this._buffer_reader=new NyARBufferReader(this._ref_buf,INyARBufferReader.BUFFERFORMAT_INT1D_X7H9S8V8_32);\r
+ }\r
+ public INyARBufferReader getBufferReader()\r
+ {\r
+ return this._buffer_reader;\r
+ }\r
+}\r
/* \r
- * PROJECT: NyARToolkit\r
+ * PROJECT: NyARToolkit(Extension)\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 edition ARToolKit class library.\r
* Copyright (C)2008-2009 Ryo Iizuka\r
*\r
+/* \r
+ * PROJECT: NyARToolkit(Extension)\r
+ * --------------------------------------------------------------------------------\r
+ * The NyARToolkit is Java edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program. If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ * http://nyatla.jp/nyatoolkit/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
package jp.nyatla.nyartoolkit.core.rasterfilter;\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
+/* \r
+ * PROJECT: NyARToolkit(Extension)\r
+ * --------------------------------------------------------------------------------\r
+ * The NyARToolkit is Java edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program. If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ * http://nyatla.jp/nyatoolkit/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
package jp.nyatla.nyartoolkit.core.rasterfilter;\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.rasterfilter;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.raster.INyARRaster;\r
+import jp.nyatla.nyartoolkit.core.rasterreader.INyARBufferReader;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
+\r
+/**\r
+ * RGB画像をHSV画像に変換します。\r
+ *\r
+ */\r
+public class NyARRasterFilter_Rgb2Hsv implements INyARRasterFilter\r
+{\r
+ private IdoFilterImpl _dofilterimpl;\r
+ public NyARRasterFilter_Rgb2Hsv(int i_raster_type) throws NyARException\r
+ {\r
+ switch (i_raster_type) {\r
+ case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
+ this._dofilterimpl=new IdoFilterImpl_BYTE1D_B8G8R8_24();\r
+ break;\r
+ case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
+ default:\r
+ throw new NyARException();\r
+ }\r
+ }\r
+ public void doFilter(INyARRaster i_input, INyARRaster i_output) throws NyARException\r
+ {\r
+ assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
+ this._dofilterimpl.doFilter(i_input.getBufferReader(),i_output.getBufferReader(),i_input.getSize());\r
+ }\r
+ \r
+ abstract class IdoFilterImpl\r
+ {\r
+ public abstract void doFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size) throws NyARException;\r
+ \r
+ }\r
+ class IdoFilterImpl_BYTE1D_B8G8R8_24 extends IdoFilterImpl\r
+ {\r
+ public void doFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size) throws NyARException\r
+ {\r
+ assert( i_input.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_X7H9S8V8_32));\r
+ \r
+ int[] out_buf = (int[]) i_output.getBuffer();\r
+ byte[] in_buf = (byte[]) i_input.getBuffer();\r
+ int s;\r
+ for(int i=i_size.h*i_size.w-1;i>=0;i--)\r
+ {\r
+ int r=(in_buf[i*3+2] & 0xff);\r
+ int g=(in_buf[i*3+1] & 0xff);\r
+ int b=(in_buf[i*3+0] & 0xff);\r
+ int cmax,cmin;\r
+ //最大値と最小値を計算\r
+ if(r>g){\r
+ cmax=r;\r
+ cmin=g;\r
+ }else{\r
+ cmax=g;\r
+ cmin=r;\r
+ }\r
+ if(b>cmax){\r
+ cmax=b;\r
+ }\r
+ if(b<cmin){\r
+ cmin=b;\r
+ }\r
+ int h;\r
+ if(cmax==0) {\r
+ s=0;\r
+ h=0;\r
+ }else {\r
+ s=(cmax-cmin)*255/cmax;\r
+ int cdes=cmax-cmin;\r
+ //H成分を計算\r
+ if(cdes!=0){\r
+ if(cmax==r){\r
+ h=(g-b)*60/cdes;\r
+ }else if(cmax==g){\r
+ h=(b-r)*60/cdes+2*60;\r
+ }else{\r
+ h=(r-g)*60/cdes+4*60;\r
+ }\r
+ }else{\r
+ h=0;\r
+ }\r
+ }\r
+ if(h<0)\r
+ {\r
+ h+=360;\r
+ }\r
+ //hsv変換(h9s8v8)\r
+ out_buf[i]=(0x1ff0000&(h<<16))|(0x00ff00&(s<<8))|(cmax&0xff);\r
+ }\r
+ return;\r
+ }\r
+ } \r
+}
\ No newline at end of file
+/* \r
+ * PROJECT: NyARToolkit(Extension)\r
+ * --------------------------------------------------------------------------------\r
+ * The NyARToolkit is Java edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program. If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ * http://nyatla.jp/nyatoolkit/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
package jp.nyatla.nyartoolkit.core.rasterfilter;\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core2.rasterfilter.rgb2gs.NyARRasterFilter_RgbAve;
import jp.nyatla.utils.NyObjectStack;
import jp.nyatla.utils.j2se.LabelingBufferdImage;
+import jp.nyatla.nyartoolkit.core.rasterfilter.bin.INyARRasterFilter_RgbToGs;
import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;
import jp.nyatla.nyartoolkit.core.squaredetect.INyARSquareDetector;
import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;
*/\r
package jp.nyatla.nyartoolkit.dev;\r
\r
-import java.awt.Frame;\r
import java.awt.*;\r
import java.awt.event.WindowAdapter;\r
import java.awt.event.WindowEvent;\r
import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.raster.*;\r
import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster_BGRA;\r
-import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.gs2bin.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.NyARRasterFilterBuilder_RgbToBin;\r
\r
\r
import jp.nyatla.utils.j2se.*;\r
fs.read(buf);\r
NyARRgbRaster_BGRA ra = NyARRgbRaster_BGRA.wrap(buf, W, H);\r
// 二値化\r
- NyARRasterFilter_ARToolkitThreshold filter = new NyARRasterFilter_ARToolkitThreshold(110, ra.getBufferReader().getBufferType());\r
+ NyARRasterFilterBuilder_RgbToBin filter = new NyARRasterFilterBuilder_RgbToBin(110, ra.getBufferReader().getBufferType());\r
NyARBinRaster bin = new NyARBinRaster(W,240);\r
filter.doFilter(ra, bin);\r
int[] t = (int[]) bin.getBufferReader().getBuffer();\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 edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program. If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ * http://nyatla.jp/nyatoolkit/\r
+ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.dev;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.labeling.LabelOverlapChecker;\r
+import jp.nyatla.nyartoolkit.core.labeling.rlelabeling.*;\r
+import jp.nyatla.nyartoolkit.core.param.NyARCameraDistortionFactor;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.Coord2SquareVertexIndexes;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;\r
+import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint2d;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
+import jp.nyatla.nyartoolkit.core.types.NyARLinear;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.*;\r
+import jp.nyatla.nyartoolkit.core.param.*;\r
+\r
+\r
+\r
+/**\r
+ * \r
+ *\r
+ */\r
+public class NyARSquareDetector_Vector\r
+{\r
+ private static final int AR_AREA_MAX = 100000;// #define AR_AREA_MAX 100000\r
+ private static final int AR_AREA_MIN = 70;// #define AR_AREA_MIN 70\r
+ private final int _width;\r
+ private final int _height;\r
+ private final int[] _xcoord;\r
+ private final int[] _ycoord;\r
+\r
+ private final NyARLabeling_Rle _labeling;\r
+\r
+ private final LabelOverlapChecker<RleLabelFragmentInfoStack.RleLabelFragmentInfo> _overlap_checker = new LabelOverlapChecker<RleLabelFragmentInfoStack.RleLabelFragmentInfo>(32,RleLabelFragmentInfoStack.RleLabelFragmentInfo.class);\r
+ private final SquareContourDetector_Vector _sqconvertor;\r
+ private final ContourPickup _cpickup=new ContourPickup();\r
+ private final RleLabelFragmentInfoStack _stack;\r
+ \r
+ private final int _max_coord;\r
+ /**\r
+ * 最大i_squre_max個のマーカーを検出するクラスを作成する。\r
+ * \r
+ * @param i_param\r
+ */\r
+ public NyARSquareDetector_Vector(NyARCameraDistortionFactor i_dist_factor_ref,NyARIntSize i_size) throws NyARException\r
+ {\r
+ this._width = i_size.w;\r
+ this._height = i_size.h;\r
+ //ラベリングのサイズを指定したいときはsetAreaRangeを使ってね。\r
+ this._labeling = new NyARLabeling_Rle(this._width,this._height);\r
+ this._labeling.setAreaRange(AR_AREA_MAX, AR_AREA_MIN);\r
+ this._sqconvertor=new SquareContourDetector_Vector(i_size,i_dist_factor_ref);\r
+ this._stack=new RleLabelFragmentInfoStack(i_size.w*i_size.h*2048/(320*240)+32);//検出可能な最大ラベル数\r
+ \r
+\r
+ // 輪郭の最大長は画面に映りうる最大の長方形サイズ。\r
+ int number_of_coord = (this._width + this._height) * 2;\r
+\r
+ // 輪郭バッファ\r
+ this._max_coord = number_of_coord;\r
+ this._xcoord = new int[number_of_coord];\r
+ this._ycoord = new int[number_of_coord];\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * arDetectMarker2を基にした関数\r
+ * この関数はNyARSquare要素のうち、directionを除くパラメータを取得して返します。\r
+ * directionの確定は行いません。\r
+ * @param i_raster\r
+ * 解析する2値ラスタイメージを指定します。\r
+ * @param o_square_stack\r
+ * 抽出した正方形候補を格納するリスト\r
+ * @throws NyARException\r
+ */\r
+ public final void detectMarker(NyARGrayscaleRaster i_gs,int i_th,NyARSquareStack o_square_stack) throws NyARException\r
+ {\r
+ final RleLabelFragmentInfoStack flagment=this._stack;\r
+ final LabelOverlapChecker<RleLabelFragmentInfoStack.RleLabelFragmentInfo> overlap = this._overlap_checker;\r
+\r
+ // マーカーホルダをリセット\r
+ o_square_stack.clear();\r
+\r
+ // ラベル数が0ならここまで\r
+ final int label_num=this._labeling.labeling(i_gs,i_th, 0, i_gs.getHeight(), flagment);\r
+ if (label_num < 1) {\r
+ return;\r
+ }\r
+ //ラベルをソートしておく\r
+ flagment.sortByArea();\r
+ //ラベルリストを取得\r
+ RleLabelFragmentInfoStack.RleLabelFragmentInfo[] labels=flagment.getArray();\r
+\r
+ final int xsize = this._width;\r
+ final int ysize = this._height;\r
+ final int coord_max = this._max_coord;\r
+ int[] xcoord = this._xcoord;\r
+ int[] ycoord = this._ycoord;\r
+\r
+\r
+ //重なりチェッカの最大数を設定\r
+ overlap.setMaxLabels(label_num);\r
+\r
+ for (int i=0; i < label_num; i++) {\r
+ final RleLabelFragmentInfoStack.RleLabelFragmentInfo label_pt=labels[i];\r
+ final int label_area = label_pt.area;\r
+ \r
+ // クリップ領域が画面の枠に接していれば除外\r
+ if (label_pt.clip_l == 0 || label_pt.clip_r == xsize-1){\r
+ continue;\r
+ }\r
+ if (label_pt.clip_t == 0 || label_pt.clip_b == ysize-1){\r
+ continue;\r
+ }\r
+ // 既に検出された矩形との重なりを確認\r
+ if (!overlap.check(label_pt)) {\r
+ // 重なっているようだ。\r
+ continue;\r
+ }\r
+ \r
+ // 輪郭を取得\r
+ final int coord_num = _cpickup.getContour(i_gs,i_th,label_pt.entry_x,label_pt.clip_t, coord_max, xcoord, ycoord);\r
+ if (coord_num == coord_max) {\r
+ // 輪郭が大きすぎる。\r
+ continue;\r
+ }\r
+\r
+ //ここから先が輪郭分析\r
+ NyARSquare square_ptr = o_square_stack.prePush();\r
+ if(!this._sqconvertor.coordToSquare(i_gs,xcoord,ycoord,coord_num,label_area,square_ptr)){\r
+ o_square_stack.pop();// 頂点の取得が出来なかったので破棄\r
+ continue; \r
+ }\r
+ // 検出済の矩形の属したラベルを重なりチェックに追加する。\r
+ overlap.push(label_pt);\r
+ }\r
+ return;\r
+ }\r
+ /**\r
+ * デバック用API\r
+ * @return\r
+ */\r
+ public RleLabelFragmentInfoStack _getFragmentStack()\r
+ {\r
+ return this._stack;\r
+ }\r
+ /********************************************************************************\r
+ * \r
+ * 追加クラス \r
+ * \r
+ ********************************************************************************/\r
+ private class SquareContourDetector_Vector\r
+ {\r
+ private final NyARObserv2IdealMap2 _distmap;\r
+ private final int[] __detectMarker_mkvertex = new int[4];\r
+ private final Coord2SquareVertexIndexes _coord2vertex=new Coord2SquareVertexIndexes();\r
+ public SquareContourDetector_Vector(NyARIntSize i_size,NyARCameraDistortionFactor i_distfactor_ref)\r
+ {\r
+ this._distmap=new NyARObserv2IdealMap2(i_distfactor_ref,i_size);\r
+ return;\r
+ }\r
+\r
+ public boolean coordToSquare(NyARGrayscaleRaster i_raster,int[] i_xcoord,int[] i_ycoord,int i_coord_num,int i_label_area,NyARSquare o_square) throws NyARException\r
+ {\r
+\r
+ final int[] mkvertex = this.__detectMarker_mkvertex;\r
+\r
+ // 頂点情報を取得\r
+ if (!this._coord2vertex.getVertexIndexes(i_xcoord, i_ycoord,i_coord_num, i_label_area, mkvertex)) {\r
+ // 頂点の取得が出来なかったので破棄\r
+ return false;\r
+ } \r
+ // マーカーを検出\r
+ if (!getSquareLine(i_raster,mkvertex, i_xcoord, i_ycoord,i_coord_num, o_square)){\r
+ // 矩形が成立しなかった。\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ /**\r
+ * 指定した範囲の輪郭点ベクトル・座標を、加算する。\r
+ * @param i_raster\r
+ * @param i_xcoord\r
+ * @param i_ycoord\r
+ * @param i_st\r
+ * @param i_ed\r
+ * @param o_vecsum\r
+ * @param o_possum\r
+ * @return\r
+ */\r
+ private boolean addCoordVecPos(NyARGrayscaleRaster i_raster,int[] i_xcoord, int[] i_ycoord,int i_st,int i_ed,NyARIntPoint2d io_vecsum)\r
+ {\r
+ int dxi,dyi;\r
+ //ベクトル分析\r
+ dxi=io_vecsum.x;\r
+ dyi=io_vecsum.y;\r
+ for(int i=i_st;i<i_ed;i++){\r
+ //境界に設置していたら失敗する。\r
+ if(i_xcoord[i]<1 || i_ycoord[i]<1 || i_xcoord[i]>=319 || i_ycoord[i]>=239){\r
+ return false;\r
+ }\r
+ //o_vecsumをワークに流用\r
+ i_raster.getPixelVector8(i_xcoord[i],i_ycoord[i],io_vecsum);\r
+ dxi+=io_vecsum.x;\r
+ dyi-=io_vecsum.y;\r
+ }\r
+ io_vecsum.x=dxi;\r
+ io_vecsum.y=dyi;\r
+ return true; \r
+ }\r
+ \r
+ \r
+ private NyARDoublePoint2d __work_pos=new NyARDoublePoint2d();\r
+ \r
+ private boolean getSquareLine(NyARGrayscaleRaster i_raster,int[] i_mkvertex, int[] i_xcoord, int[] i_ycoord,int i_cood_num, NyARSquare o_square) throws NyARException\r
+ {\r
+ final NyARLinear[] l_line = o_square.line;\r
+ final NyARDoublePoint2d[] l_sqvertex = o_square.sqvertex;\r
+ final NyARIntPoint2d[] l_imvertex = o_square.imvertex;\r
+ final NyARDoublePoint2d idealcenter=this.__work_pos;\r
+ \r
+ NyARIntPoint2d vecsum=new NyARIntPoint2d();\r
+ for (int i = 0; i < 4; i++){\r
+ //頂点を取得\r
+ int ver1=i_mkvertex[i];\r
+ int ver2=i_mkvertex[(i+1)%4];\r
+\r
+ int n,st,ed;\r
+ double w1;\r
+ //探索区間の決定\r
+ if(ver2>=i_mkvertex[i]){\r
+ //頂点[i]から頂点[i+1]までの輪郭が、1区間にあるとき\r
+ w1 = (double) (ver2 - ver1 + 1) * 0.05 + 0.5;\r
+ //探索区間の決定\r
+ st = (int) (ver1+w1);\r
+ ed = (int) (ver2 - w1);\r
+ }else{\r
+ //頂点[i]から頂点[i+1]までの輪郭が、2区間に分かれているとき\r
+ w1 = (double) (ver2+i_cood_num-ver1+1)%i_cood_num * 0.05 + 0.5;\r
+ //探索区間の決定\r
+ st = (int) (ver1+w1)%i_cood_num;\r
+ ed = (int) (ver2+i_cood_num-w1)%i_cood_num;\r
+ }\r
+ vecsum.x=vecsum.y=0;\r
+ //ベクトル分析\r
+ if(st<=ed){\r
+ //1区間\r
+ n = ed - st+1;\r
+ addCoordVecPos(i_raster,i_xcoord,i_ycoord,st,ed+1,vecsum);\r
+ this._distmap.getIdealCoodCenter(i_xcoord, i_ycoord,st,n,idealcenter);\r
+ }else{\r
+ //探索区間は2区間\r
+ double cx,cy;\r
+ n=ed+i_cood_num-st+1;\r
+ addCoordVecPos(i_raster,i_xcoord,i_ycoord,st,i_cood_num,vecsum);\r
+ addCoordVecPos(i_raster,i_xcoord,i_ycoord,0,ed,vecsum);\r
+ //輪郭の中心位置を計算\r
+ this._distmap.getIdealCoodCenter(i_xcoord, i_ycoord,st,i_cood_num-st,idealcenter);\r
+ cx=idealcenter.x;\r
+ cy=idealcenter.y;\r
+ this._distmap.getIdealCoodCenter(i_xcoord, i_ycoord,0,ed+1,idealcenter);\r
+ idealcenter.x=(idealcenter.x+cx)/2;\r
+ idealcenter.y=(idealcenter.y+cy)/2;\r
+ }\r
+ //中央値を歪修正(ほんとはピクセル単位にゆがみ矯正するべきだと思う)\r
+ \r
+ double l=Math.sqrt((double)(vecsum.x*vecsum.x+vecsum.y*vecsum.y));\r
+ final NyARLinear l_line_i = l_line[i];\r
+ //直交するベクトルを計算\r
+ l_line_i.dy = vecsum.x/l;\r
+ l_line_i.dx = -vecsum.y/l;\r
+ //cを計算\r
+ l_line_i.c = -(l_line_i.dy * (idealcenter.x) + l_line_i.dx * (idealcenter.y));\r
+ \r
+ // 頂点インデクスから頂点座標を得て保存\r
+ l_imvertex[i].x = i_xcoord[ver1];\r
+ l_imvertex[i].y = i_ycoord[ver1];\r
+ }\r
+ //線分式から頂点を計算\r
+ for(int i=0;i<4;i++)\r
+ {\r
+ if(!NyARLinear.crossPos(l_line[i],l_line[(i + 3) % 4],l_sqvertex[i])){\r
+ return false;\r
+ }\r
+ } \r
+ return true;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * 輪郭線の中心位置を計算する関数を追加したマップクラス\r
+ */\r
+ private class NyARObserv2IdealMap2 extends NyARObserv2IdealMap\r
+ {\r
+ public NyARObserv2IdealMap2(NyARCameraDistortionFactor i_distfactor,NyARIntSize i_screen_size)\r
+ {\r
+ super(i_distfactor,i_screen_size);\r
+ }\r
+ /**\r
+ * 歪み矯正した座標における、各座標の合計値を\r
+ * @param i_x_coord\r
+ * @param i_y_coord\r
+ * @param i_start\r
+ * @param i_num\r
+ * @param o_center\r
+ */\r
+ public void getIdealCoodCenter(int[] i_x_coord, int[] i_y_coord,int i_start, int i_num,NyARDoublePoint2d o_center)\r
+ {\r
+ int idx;\r
+ double x,y;\r
+ x=y=0;\r
+ final double[] mapx=this._mapx;\r
+ final double[] mapy=this._mapy;\r
+ final int stride=this._stride;\r
+ for (int j = 0; j < i_num; j++){\r
+ idx=i_x_coord[i_start + j]+i_y_coord[i_start + j]*stride;\r
+ x+=mapx[idx];\r
+ y+=mapy[idx];\r
+ }\r
+ o_center.x=x/(double)i_num;\r
+ o_center.y=y/(double)i_num;\r
+ return;\r
+ }\r
+ } \r
+}\r
+\r
+\r
+\r
import jp.nyatla.nyartoolkit.detector.*;\r
import jp.nyatla.nyartoolkit.jmf.utils.*;\r
import jp.nyatla.nyartoolkit.jogl.utils.*;\r
+/**\r
+ * 2種類の最適化アルゴリズムを比較するテストプログラム\r
+ *\r
+ */\r
+\r
class Program implements JmfCaptureListener\r
{\r
- private OptimizeView _view1;\r
- private OptimizeView _view2;\r
+ private OptimizeCompareTest _view1;\r
+ private OptimizeCompareTest _view2;\r
public Object _sync_object=new Object(); \r
public NyARParam _ar_param;\r
public NyARCode _ar_code;\r
- private final static int SCREEN_X = 640;\r
- private final static int SCREEN_Y = 480;\r
+ private final static int SCREEN_X = 320;\r
+ private final static int SCREEN_Y = 240;\r
private JmfCaptureDevice _capture;\r
public GLNyARRaster_RGB _cap_image;\r
public Program(NyARParam i_param, NyARCode i_ar_code) throws NyARException\r
this._capture.setOnCapture(this);\r
// GL対応のRGBラスタオブジェクト\r
this._cap_image = new GLNyARRaster_RGB(i_param, this._capture.getCaptureFormat()); \r
- this._view1=new OptimizeView(this,NyARSingleDetectMarker.PF_NYARTOOLKIT);\r
- this._view2=new OptimizeView(this,NyARSingleDetectMarker.PF_NYARTOOLKIT_ARTOOLKIT_FITTING);\r
+ this._view1=new OptimizeCompareTest(this,NyARSingleDetectMarker.PF_NYARTOOLKIT);\r
+ this._view2=new OptimizeCompareTest(this,NyARSingleDetectMarker.PF_NYARTOOLKIT_ARTOOLKIT_FITTING);\r
this._capture.start();\r
return;\r
}\r
* simpleLiteと同じようなテストプログラム 出来る限りARToolKitのサンプルと似せて作ってあります。 最も一致する"Hiro"マーカーを一つ選択して、その上に立方体を表示します。\r
* \r
*/\r
-public class OptimizeView implements GLEventListener\r
+public class OptimizeCompareTest implements GLEventListener\r
{\r
- private final static int SCREEN_X = 640;\r
+ private final static int SCREEN_X = 320;\r
\r
- private final static int SCREEN_Y = 480;\r
+ private final static int SCREEN_Y = 240;\r
\r
private Animator _animator;\r
\r
private double[] _camera_projection = new double[16];\r
\r
\r
- public OptimizeView(Program i_program,int i_pf) throws NyARException\r
+ public OptimizeCompareTest(Program i_program,int i_pf) throws NyARException\r
{\r
this._parent=i_program;\r
this._ar_param = i_program._ar_param;\r
\r
// NyARToolkitの準備\r
this._nya = new NyARSingleDetectMarker(this._ar_param, i_program._ar_code, 80.0,i_program._cap_image.getBufferReader().getBufferType(),i_pf);\r
- this._nya.setContinueMode(false);// ここをtrueにすると、transMatContinueモード(History計算)になります。\r
+ this._nya.setContinueMode(true);// ここをtrueにすると、transMatContinueモード(History計算)になります。\r
\r
// 3Dを描画するコンポーネント\r
GLCanvas canvas = new GLCanvas();\r
import jp.nyatla.nyartoolkit.core.raster.*;\r
import jp.nyatla.nyartoolkit.core.types.*;\r
import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
-import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.gs2bin.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.NyARRasterFilterBuilder_RgbToBin;\r
import jp.nyatla.utils.j2se.*;\r
import jp.nyatla.nyartoolkit.nyidmarker.*;\r
import jp.nyatla.nyartoolkit.core.squaredetect.*;\r
\r
{// ピックアップ画像の表示\r
// 矩形抽出\r
- INyARRasterFilter_RgbToBin to_binfilter = new NyARRasterFilter_ARToolkitThreshold(110, i_raster.getBufferReader().getBufferType());\r
+ INyARRasterFilter_Bin to_binfilter = new NyARRasterFilterBuilder_RgbToBin(110, i_raster.getBufferReader().getBufferType());\r
to_binfilter.doFilter(i_raster, this._bin_raster);\r
if (this.detect.detectMarkerLite(i_raster, 100)) {\r
\r