Пример #1
0
 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));
 }
Пример #2
0
        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;
        }
Пример #3
0
        /**
         * 格納している情報から、ファイルイメージを生成します。
         * @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());
        }
Пример #4
0
        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;
        }