public static NyARNftFsetFile genFeatureSet(NyARNftIsetFile i_iset_file, int i_occupancy_size, double i_max_sim_th, double i_min_sim_th, double i_sd_th) { NyARNftIsetFile.ReferenceImage[] items = i_iset_file.items; NyARNftFsetFile.NyAR2FeaturePoints[] points = new NyARNftFsetFile.NyAR2FeaturePoints[items.Length]; for (int i = 0; i < items.Length; i++) { NyARNftIsetFile.ReferenceImage rimg = items[i]; //MAX-dpiとMIN-dpiを計算 double max_dpi = Double.MaxValue; double min_dpi = rimg.dpi * 0.5; for (int j = 0; j < items.Length; j++) { if (rimg.dpi < items[j].dpi && max_dpi > items[j].dpi) { max_dpi = items[j].dpi; } if (rimg.dpi > items[j].dpi && min_dpi < items[j].dpi) { min_dpi = items[j].dpi; } } if (max_dpi == Double.MaxValue) { max_dpi = rimg.dpi * 2; } else { max_dpi = rimg.dpi * 0.8 + max_dpi * 0.2; } //MIN-dpiの計算(一番近い小さい値 points[i] = new NyARNftFsetFile.NyAR2FeaturePoints(rimg, i_occupancy_size, i_max_sim_th, i_min_sim_th, i_sd_th, max_dpi, min_dpi, i); } return(new NyARNftFsetFile(points)); }
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 NyARNftFreakFsetFile genFeatureSet3(NyARNftIsetFile i_iset_file) { int max_features = 500; DogFeaturePointStack _dog_feature_points = new DogFeaturePointStack(max_features); FreakFeaturePointStack query_keypoint = new FreakFeaturePointStack(max_features); // List <NyARNftFreakFsetFile.RefDataSet> refdataset = new List <NyARNftFreakFsetFile.RefDataSet>(); List <NyARNftFreakFsetFile.ImageInfo> imageinfo = new List <NyARNftFreakFsetFile.ImageInfo>(); for (int ii = 0; ii < i_iset_file.items.Length; ii++) { NyARNftIsetFile.ReferenceImage rimg = i_iset_file.items[ii]; FREAKExtractor mFeatureExtractor = new FREAKExtractor(); int octerves = BinomialPyramid32f.octavesFromMinimumCoarsestSize(rimg.width, rimg.height, 8); BinomialPyramid32f _pyramid = new BinomialPyramid32f(rimg.width, rimg.height, octerves, 3); DoGScaleInvariantDetector _dog_detector = new DoGScaleInvariantDetector(rimg.width, rimg.height, octerves, 3, 3, 4, max_features); //RefDatasetの作成 _pyramid.build(NyARGrayscaleRaster.createInstance(rimg.width, rimg.height, NyARBufferType.INT1D_GRAY_8, rimg.img)); // Detect feature points _dog_feature_points.clear(); _dog_detector.detect(_pyramid, _dog_feature_points); // Extract features query_keypoint.clear(); mFeatureExtractor.extract(_pyramid, _dog_feature_points, query_keypoint); for (int i = 0; i < query_keypoint.getLength(); i++) { FreakFeaturePoint ffp = query_keypoint.getItem(i); NyARNftFreakFsetFile.RefDataSet rds = new NyARNftFreakFsetFile.RefDataSet(); rds.pageNo = 1; rds.refImageNo = ii; rds.coord2D.setValue(ffp.x, ffp.y); rds.coord3D.setValue((ffp.x + 0.5f) / rimg.dpi * 25.4f, ((rimg.height - 0.5f) - ffp.y) / rimg.dpi * 25.4f); rds.featureVec.angle = ffp.angle; rds.featureVec.maxima = ffp.maxima ? 1 : 0; rds.featureVec.scale = ffp.scale; ffp.descripter.getValueLe(rds.featureVec.v); refdataset.Add(rds); } imageinfo.Add(new NyARNftFreakFsetFile.ImageInfo(rimg.width, rimg.height, ii)); } NyARNftFreakFsetFile.PageInfo[] pi = new NyARNftFreakFsetFile.PageInfo[1]; pi[0] = new NyARNftFreakFsetFile.PageInfo(1, imageinfo.ToArray()); return(new NyARNftFreakFsetFile(refdataset.ToArray(), pi)); }
public static NyARNftFsetFile genFeatureSet(NyARNftIsetFile i_iset_file, int i_level) { int[] occs = { AR2_DEFAULT_OCCUPANCY_SIZE, AR2_DEFAULT_OCCUPANCY_SIZE, AR2_DEFAULT_OCCUPANCY_SIZE *2 / 3, AR2_DEFAULT_OCCUPANCY_SIZE *2 / 3, AR2_DEFAULT_OCCUPANCY_SIZE *1 / 2 }; double[][] data = { new double[] { AR2_DEFAULT_SD_THRESH_L0, AR2_DEFAULT_MIN_SIM_THRESH_L0, AR2_DEFAULT_MAX_SIM_THRESH_L0 }, new double[] { AR2_DEFAULT_SD_THRESH_L1, AR2_DEFAULT_MIN_SIM_THRESH_L1, AR2_DEFAULT_MAX_SIM_THRESH_L1 }, new double[] { AR2_DEFAULT_SD_THRESH_L2, AR2_DEFAULT_MIN_SIM_THRESH_L2, AR2_DEFAULT_MAX_SIM_THRESH_L2 }, new double[] { AR2_DEFAULT_SD_THRESH_L3, AR2_DEFAULT_MIN_SIM_THRESH_L3, AR2_DEFAULT_MAX_SIM_THRESH_L3 }, new double[] { AR2_DEFAULT_SD_THRESH_L3, AR2_DEFAULT_MIN_SIM_THRESH_L3, AR2_DEFAULT_MAX_SIM_THRESH_L3 } }; return(genFeatureSet(i_iset_file, occs[i_level], data[i_level][2], data[i_level][1], data[i_level][0])); }
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 static NyARNftFsetFile genFeatureSet(NyARNftIsetFile i_iset_file) { return(genFeatureSet(i_iset_file, 2)); }
public NyARSurfaceDataSet(NyARNftIsetFile i_iset, NyARNftFsetFile i_fset) { this.iset = i_iset; this.fset = i_fset; }