public NyARNftDataSetFile(NyARNftIsetFile i_iset, NyARNftFsetFile i_fset, NyARNftFreakFsetFile i_freak_fset) { this.iset = i_iset; this.fset = i_fset; this.fset3 = i_freak_fset; //iset,fset,fset3から初期化済インスタンスを生成 }
public static NyARSurfaceDataSet loadFromSurfaceFiles(Stream i_iset_stream, Stream i_fset_stream) { NyARNftIsetFile iset = NyARNftIsetFile.loadFromIsetFile(i_iset_stream); NyARNftFsetFile fset = NyARNftFsetFile.loadFromFsetFile(i_fset_stream); return(new NyARSurfaceDataSet(iset, fset)); }
private static void scaling(NyARNftIsetFile i_iset, NyARNftFsetFile i_fset, NyARNftFreakFsetFile i_freak_fset, int i_freak_fset_page_id, double i_width_in_msec) { //比率計算 double new_dpi = (i_iset.items[0].width / i_width_in_msec) * 25.4; double dpi_rate = (new_dpi / i_iset.items[0].dpi); //isetの更新(dpiを) for (int i = 0; i < i_iset.items.Length; i++) { i_iset.items[i].dpi *= dpi_rate; } //fsetの更新 for (int i = 0; i < i_fset.list.Length; i++) { i_fset.list[i].maxdpi *= dpi_rate; i_fset.list[i].mindpi *= dpi_rate; //ピクセル値に戻す係数 foreach (NyARNftFsetFile.NyAR2FeatureCoord j in i_fset.list[i].coord) { j.mx = j.mx / dpi_rate; j.my = j.my / dpi_rate; } } //fset3の更新 for (int i = 0; i < i_freak_fset.ref_point.Length; i++) { i_freak_fset.ref_point[i].coord3D.x /= dpi_rate; i_freak_fset.ref_point[i].coord3D.y /= dpi_rate; } }
/** * 3種類のファイルに対応した入力ストリームから、特徴データを読み出します。 * @param i_iset_stream * @param i_fset_stream * @param i_fset3_stream * @param i_freak_fset_page_id * @param i_width_in_msec * NFTターゲット画像の横幅をmmで指定します。スケーリングが不要な場合はNaNを指定します。 * @return */ public static NyARNftDataSet loadFromNftFiles(Stream i_iset_stream, Stream i_fset_stream, Stream i_fset3_stream, int i_freak_fset_page_id, double i_width_in_msec) { return(new NyARNftDataSet( NyARNftIsetFile.loadFromIsetFile(i_iset_stream), NyARNftFsetFile.loadFromFsetFile(i_fset_stream), NyARNftFreakFsetFile.loadFromfset3File(i_fset3_stream), i_freak_fset_page_id, i_width_in_msec)); }
/** * コンストラクタです。 * ファイルイメージからデータセットを生成します。 * @param i_iset * @param i_fset * @param i_freak_fset * @param i_freak_fset_page_id */ public NyARNftDataSet(NyARNftIsetFile i_iset, NyARNftFsetFile i_fset, NyARNftFreakFsetFile i_freak_fset, int i_freak_fset_page_id, double i_width_in_msec) { if (!Double.IsNaN(i_width_in_msec)) { scaling(i_iset, i_fset, i_freak_fset, i_freak_fset_page_id, i_width_in_msec); } this.surface_dataset = new NyARSurfaceDataSet(i_iset, i_fset); this.freak_fset = new KeyframeMap(i_freak_fset, i_freak_fset_page_id); }
public static NyARNftDataSetFile loadFromNftFilePack(byte[] i_byte) { jp.nyatla.nyartoolkit.cs.cs4.BinaryReader br = new jp.nyatla.nyartoolkit.cs.cs4.BinaryReader(i_byte, jp.nyatla.nyartoolkit.cs.cs4.BinaryReader.ENDIAN_LITTLE); //タイプチェック String header = byteArray2NullTerminateStr(br.getByteArray(32)); if (header.CompareTo(HS_NFTPACK_V1) != 0) { throw new NyARRuntimeException("Invalid header"); } //Entryの取得 int num_of_entry = br.getInt(); if (num_of_entry != 3) { throw new NyARRuntimeException("Invalid entry size"); } int[] entry_info = br.getIntArray(num_of_entry * 2); return(new NyARNftDataSetFile( NyARNftIsetFile.loadFromIsetFile(br.getByteArray(entry_info[2 * 0 + 1]), NyARNftIsetFile.FILE_FORMAT_ARTK_V5RAW), NyARNftFsetFile.loadFromFsetFile(br.getByteArray(entry_info[2 * 1 + 1])), NyARNftFreakFsetFile.loadFromfset3File(br.getByteArray(entry_info[2 * 2 + 1])))); }
public NyARSurfaceDataSet(NyARNftIsetFile i_iset, NyARNftFsetFile i_fset) { this.iset = i_iset; this.fset = i_fset; }
public void extractVisibleFeatures( NyARNftFsetFile i_fset, NyARSurfaceTransMatrixSet i_ctrans, NyARSurfaceFeatures candidate, NyARSurfaceFeatures candidate2) { //get work objects NyARDoublePoint2d ide2d = this.__ide2d; NyARDoublePoint2d obs2d = this.__obs2d; NyARDoublePoint2d rideal2d = this.__rideal2d; // trans1.setCoefficient(i_cparam.getPerspectiveProjectionMatrix(), trans1); candidate.clear(); candidate2.clear(); int xsize = this._ref_size.w; int ysize = this._ref_size.h; INyARCameraDistortionFactor df = this._ref_dist_factor; for (int j = 0; j < i_fset.list.Length; j++) { NyARNftFsetFile.NyAR2FeaturePoints fpoint_ptr = i_fset.list[j]; for (int k = 0; k < fpoint_ptr.coord.Length; k++) { NyARNftFsetFile.NyAR2FeatureCoord coord_ptr = fpoint_ptr.coord[k]; //理想画面点を計算 i_ctrans.calculate2dPos(coord_ptr.mx, coord_ptr.my, ide2d); df.ideal2Observ(ide2d.x, ide2d.y, obs2d); //観察座標に変換後、画面内にあるか確認 if (obs2d.x < 0 || obs2d.x >= xsize) { continue; } if (obs2d.y < 0 || obs2d.y >= ysize) { continue; } //逆変換可能か確認 df.observ2Ideal(obs2d, rideal2d); if (ide2d.sqDist(rideal2d) > 1.0) { continue; } //原点からのベクトルを計算 //Z軸が+だとつかえないので判定? if (i_ctrans.calculateVd(coord_ptr.mx, coord_ptr.my) > -0.1) { continue; } // double vd0 = trans1.m00 * coord_ptr.mx+ trans1.m01 * coord_ptr.my+ trans1.m03; // double vd1 = trans1.m10 * coord_ptr.mx+ trans1.m11 * coord_ptr.my+ trans1.m13; // double vd2 = trans1.m20 * coord_ptr.mx+ trans1.m21 * coord_ptr.my+ trans1.m23; // if( (vd0*trans1.m02 + vd1*trans1.m12 + vd2*trans1.m22)/Math.sqrt( vd0*vd0 + vd1*vd1 + vd2*vd2 ) > -0.1 ){ // continue; // } //撮影箇所のdpiを計算(x,y方向で計算して、大・小の順番で格納?) double dpi = i_ctrans.ar2GetMinResolution(coord_ptr); //dpiによってコレクトする候補を分離 if (dpi <= fpoint_ptr.maxdpi && dpi >= fpoint_ptr.mindpi) { NyARSurfaceFeatureItem item = candidate.prePush(); if (item == null) { return; } item.ref_feature = coord_ptr; item.scale = fpoint_ptr.scale; item.x = obs2d.x; item.y = obs2d.y; } else if (dpi <= fpoint_ptr.maxdpi * 2 && dpi >= fpoint_ptr.mindpi / 2) { NyARSurfaceFeatureItem item = candidate2.prePush(); if (item == null) { return; } item.ref_feature = coord_ptr; item.scale = fpoint_ptr.scale; item.x = obs2d.x; item.y = obs2d.y; } } } return; }