/** * ARMarkerInfo2 *arDetectMarker2( ARInt16 *limage, int label_num, int *label_ref,int *warea, double *wpos, int *wclip,int area_max, int area_min, double * factor, int *marker_num ) 関数の代替品 ラベリング情報からマーカー一覧を作成してo_marker_listを更新します。 関数はo_marker_listに重なりを除外したマーカーリストを作成します。 * * @param i_raster * 解析する2値ラスタイメージを指定します。 * @param o_square_stack * 抽出した正方形候補を格納するリスト * @throws NyARException */ public void detectMarker(NyARBinRaster i_raster, NyARSquareStack o_square_stack) { INyARLabeling labeling_proc = this._labeling; NyARLabelingImage limage = this._limage; // 初期化 // マーカーホルダをリセット o_square_stack.clear(); // ラベリング labeling_proc.labeling(i_raster); // ラベル数が0ならここまで int label_num = limage.getLabelStack().getLength(); if (label_num < 1) { return; } NyARLabelingLabelStack stack = limage.getLabelStack(); NyARLabelingLabel[] labels = stack.getArray(); // ラベルを大きい順に整列 stack.sortByArea(); // デカいラベルを読み飛ばし int i; for (i = 0; i < label_num; i++) { // 検査対象内のラベルサイズになるまで無視 if (labels[i].area <= AR_AREA_MAX) { break; } } int xsize = this._width; int ysize = this._height; int[] xcoord = this._xcoord; int[] ycoord = this._ycoord; int coord_max = this._max_coord; int[] mkvertex = this.__detectMarker_mkvertex; OverlapChecker overlap = this._overlap_checker; int coord_num; int label_area; NyARLabelingLabel label_pt; //重なりチェッカの最大数を設定 overlap.reset(label_num); int vertex1; for (; i < label_num; i++) { label_pt = labels[i]; label_area = label_pt.area; // 検査対象サイズよりも小さくなったら終了 if (label_area < AR_AREA_MIN) { break; } // クリップ領域が画面の枠に接していれば除外 if (label_pt.clip_l == 1 || label_pt.clip_r == xsize - 2) {// if(wclip[i*4+0] == 1 || wclip[i*4+1] ==xsize-2){ continue; } if (label_pt.clip_t == 1 || label_pt.clip_b == ysize - 2) {// if( wclip[i*4+2] == 1 || wclip[i*4+3] ==ysize-2){ continue; } // 既に検出された矩形との重なりを確認 if (!overlap.check(label_pt)) { // 重なっているようだ。 continue; } // 輪郭を取得 coord_num = limage.getContour(i, coord_max, xcoord, ycoord); if (coord_num == coord_max) { // 輪郭が大きすぎる。 continue; } //頂点候補のインデクスを取得 vertex1 = scanVertex(xcoord, ycoord, coord_num); // 頂点候補(vertex1)を先頭に並べなおした配列を作成する。 normalizeCoord(xcoord, ycoord, vertex1, coord_num); // 領域を準備する。 NyARSquare square_ptr = o_square_stack.prePush(); // 頂点情報を取得 if (!getSquareVertex(xcoord, ycoord, vertex1, coord_num, label_area, mkvertex)) { o_square_stack.pop();// 頂点の取得が出来なかったので破棄 continue; } if (!getSquareLine(mkvertex, xcoord, ycoord, square_ptr)) { // 矩形が成立しなかった。 o_square_stack.pop(); continue; } // 検出済の矩形の属したラベルを重なりチェックに追加する。 overlap.push(label_pt); } return; }