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 FsetFileDataParserV4(byte[] i_src) { BinaryReader br = new BinaryReader(i_src, BinaryReader.ENDIAN_LITTLE); int num_of_data = br.getInt(); NyARNftFsetFile.NyAR2FeaturePoints[] l = new NyARNftFsetFile.NyAR2FeaturePoints[num_of_data]; for (int i = 0; i < l.Length; i++) { int scale = br.getInt(); double maxdpi = br.getFloat(); double mindpi = br.getFloat(); int num_of_coord = br.getInt(); NyARNftFsetFile.NyAR2FeaturePoints p = new NyARNftFsetFile.NyAR2FeaturePoints(num_of_coord, scale, maxdpi, mindpi); for (int i2 = 0; i2 < num_of_coord; i2++) { p.coord[i2].x = br.getInt(); p.coord[i2].y = br.getInt(); p.coord[i2].mx = br.getFloat(); p.coord[i2].my = br.getFloat(); p.coord[i2].maxSim = br.getFloat(); } l[i] = p; } this.points = l; }
/** * 格納している情報から、ファイルイメージを生成します。 * @param i_sub_dpis * @return */ public byte[] makeBinary() { //初期メモリは2MB BinaryWriter bw = new BinaryWriter(BinaryReader.ENDIAN_LITTLE, 2 * 1024 * 1024); bw.putInt(this.points.Length); for (int i = 0; i < this.points.Length; i++) { NyARNftFsetFile.NyAR2FeaturePoints p = this.points[i]; bw.putInt(p.scale); bw.putFloat((float)p.maxdpi); bw.putFloat((float)p.mindpi); bw.putInt(p.coord.Length); for (int j = 0; j < p.coord.Length; j++) { bw.putInt(p.coord[j].x); bw.putInt(p.coord[j].y); bw.putFloat((float)p.coord[j].mx); bw.putFloat((float)p.coord[j].my); bw.putFloat((float)p.coord[j].maxSim); } } return(bw.getBinary()); }
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; }