/** * Detect scale-invariant feature points given a pyramid. * @param _i_dog_feature_points * 検出したDOG特徴点 */ public void detect(GaussianScaleSpacePyramid i_pyramid, DogFeaturePointStack i_dog_feature_points) { //clean up 1st feature stack DogFeaturePointStack tmp_fp = this._tmp_fps; tmp_fp.clear(); // Compute Laplacian images (DoG) this.mLaplacianPyramid.compute(i_pyramid); // Detect minima and maximum in Laplacian images this.extractFeatures(i_pyramid, this.mLaplacianPyramid, tmp_fp); // Sub-pixel refinement this.findSubpixelLocations(i_pyramid, tmp_fp); // Compute the gradient pyramid this.mOrientationAssignment.computeGradients(i_pyramid); AreaBuckit abuckit = this.mBuckets; if (tmp_fp.getLength() <= abuckit._buckit.Length) { //特徴点の数が要求数以下なら全てのポイントを使う。 for (int i = 0; i < tmp_fp.getLength(); i++) { this.addFeatureOrientations(i_pyramid, tmp_fp.getItem(i), i_dog_feature_points); } } else { //特徴点を選別(Prune features) // Clear the previous state abuckit.clear(); // Insert each features into a bucket for (int i = 0; i < tmp_fp.getLength(); i++) { DogFeaturePoint p = tmp_fp.getItem(i); abuckit.put(p.x, p.y, i, Math.Abs(p.score)); } // Compute an orientation for each feature point for (int i = 0; i < abuckit._buckit.Length; i++) { if (abuckit._buckit[i].first == 0) { continue; } this.addFeatureOrientations(i_pyramid, tmp_fp.getItem(abuckit._buckit[i].second), i_dog_feature_points); } } return; }
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)); }