/** * 予想位置を基準に四角形をトレースして、一定の基準をクリアするかを評価します。 * @param i_reader * @param i_edge_size * @param i_prevsq * @return * @throws NyARException */ private bool traceSquareLine(INyARVectorReader i_reader, int i_edge_size, NyARRectTargetStatus i_prevsq, NyARLinear[] o_line) { NyARDoublePoint2d p1, p2; VecLinearCoordinates vecpos = this._ref_my_pool._vecpos; //NyARIntRect i_rect p1 = i_prevsq.estimate_vertex[0]; int dist_limit = i_edge_size * i_edge_size; //強度敷居値(セルサイズ-1) // int min_th=i_edge_size*2+1; // min_th=(min_th*min_th); for (int i = 0; i < 4; i++) { p2 = i_prevsq.estimate_vertex[(i + 1) % 4]; //クリップ付きで予想位置周辺の直線のトレース i_reader.traceLineWithClip(p1, p2, i_edge_size, vecpos); //クラスタリングして、傾きの近いベクトルを探す。(限界は10度) this._ref_my_pool._vecpos_op.margeResembleCoords(vecpos); //基本的には1番でかいベクトルだよね。だって、直線状に取るんだもの。 int vid = vecpos.getMaxCoordIndex(); //データ品質規制(強度が多少強くないと。) // if(vecpos.items[vid].sq_dist<(min_th)){ // return false; // } //@todo:パラメタ調整 //角度規制(元の線分との角度を確認) if (vecpos.items[vid].getAbsVecCos(i_prevsq.vertex[i], i_prevsq.vertex[(i + 1) % 4]) < NyARMath.COS_DEG_5) { //System.out.println("CODE1"); return(false); } //@todo:パラメタ調整 //予想点からさほど外れていない点であるか。(検出点の移動距離を計算する。) double dist; dist = vecpos.items[vid].sqDistBySegmentLineEdge(i_prevsq.vertex[i], i_prevsq.vertex[i]); if (dist < dist_limit) { o_line[i].setVectorWithNormalize(vecpos.items[vid]); } else { //System.out.println("CODE2:"+dist+","+dist_limit); return(false); } //頂点ポインタの移動 p1 = p2; } return(true); }