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)); }
/** * FsetFileデータから、page_idに一致したキーマップを生成します。 * @param i_refDataSet * @param i_page_id */ public KeyframeMap(NyARNftFreakFsetFile i_refDataSet, int i_page_id) { NyARNftFreakFsetFile.PageInfo page_info = i_refDataSet.page_info[i_page_id]; int db_id = 0; for (int m = 0; m < page_info.image_info.Length; m++) { int image_no = page_info.image_info[m].image_no; int l = 0; //格納予定のデータ数を数える for (int i = 0; i < i_refDataSet.ref_point.Length; i++) { if (i_refDataSet.ref_point[i].refImageNo == image_no) { l++; } } FreakMatchPointSetStack fps = new FreakMatchPointSetStack(l); for (int i = 0; i < i_refDataSet.ref_point.Length; i++) { if (i_refDataSet.ref_point[i].refImageNo == image_no) { NyARNftFreakFsetFile.RefDataSet t = i_refDataSet.ref_point[i]; FreakMatchPointSetStack.Item fp = fps.prePush(); fp.x = t.coord2D.x; fp.y = t.coord2D.y; fp.angle = t.featureVec.angle; fp.scale = t.featureVec.scale; fp.maxima = t.featureVec.maxima > 0 ? true : false; if (i_refDataSet.ref_point[i].featureVec.v.Length != 96) { throw new NyARRuntimeException(); } fp.descripter.setValueLe(i_refDataSet.ref_point[i].featureVec.v); fp.pos3d.x = t.coord3D.x; fp.pos3d.y = t.coord3D.y; fp.pos3d.z = 0; } } Keyframe keyframe = new Keyframe(page_info.image_info[m].w, page_info.image_info[m].h, fps); this.Add(db_id++, keyframe); } return; }