2 * PROJECT: NyARToolkit
\r
3 * --------------------------------------------------------------------------------
\r
4 * This work is based on the original ARToolKit developed by
\r
7 * HITLab, University of Washington, Seattle
\r
8 * http://www.hitl.washington.edu/artoolkit/
\r
10 * The NyARToolkit is Java edition ARToolKit class library.
\r
11 * Copyright (C)2008-2009 Ryo Iizuka
\r
13 * This program is free software: you can redistribute it and/or modify
\r
14 * it under the terms of the GNU General Public License as published by
\r
15 * the Free Software Foundation, either version 3 of the License, or
\r
16 * (at your option) any later version.
\r
18 * This program is distributed in the hope that it will be useful,
\r
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
21 * GNU General Public License for more details.
\r
23 * You should have received a copy of the GNU General Public License
\r
24 * along with this program. If not, see <http://www.gnu.org/licenses/>.
\r
26 * For further information please contact.
\r
27 * http://nyatla.jp/nyatoolkit/
\r
28 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
\r
31 package jp.nyatla.nyartoolkit.core.squaredetect;
\r
33 import jp.nyatla.nyartoolkit.NyARException;
\r
34 import jp.nyatla.nyartoolkit.core.raster.*;
\r
35 import jp.nyatla.nyartoolkit.core.labeling.artoolkit.*;
\r
37 public class ContourPickup
\r
39 //巡回参照できるように、テーブルを二重化
\r
40 // 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6
\r
41 protected final static int[] _getContour_xdir = { 0, 1, 1, 1, 0,-1,-1,-1 , 0, 1, 1, 1, 0,-1,-1};
\r
42 protected final static int[] _getContour_ydir = {-1,-1, 0, 1, 1, 1, 0,-1 ,-1,-1, 0, 1, 1, 1, 0};
\r
45 * ラスタのエントリポイントから辿れる輪郭線を配列に返します。
\r
49 * @param i_array_size
\r
54 * @throws NyARException
\r
56 public int getContour(NyARBinRaster i_raster,int i_entry_x,int i_entry_y,int i_array_size,int[] o_coord_x,int[] o_coord_y) throws NyARException
\r
58 final int[] xdir = _getContour_xdir;// static int xdir[8] = { 0, 1, 1, 1, 0,-1,-1,-1};
\r
59 final int[] ydir = _getContour_ydir;// static int ydir[8] = {-1,-1, 0, 1, 1, 1, 0,-1};
\r
61 final int[] i_buf=(int[])i_raster.getBufferReader().getBuffer();
\r
62 final int width=i_raster.getWidth();
\r
63 final int height=i_raster.getHeight();
\r
64 //クリップ領域の上端に接しているポイントを得る。
\r
68 o_coord_x[0] = i_entry_x;
\r
69 o_coord_y[0] = i_entry_y;
\r
75 dir = (dir + 5) % 8;//dirの正規化
\r
76 //ここは頑張ればもっと最適化できると思うよ。
\r
77 //4隅以外の境界接地の場合に、境界チェックを省略するとかね。
\r
78 if(c>=1 && c<width-1 && r>=1 && r<height-1){
\r
79 for(;;){//gotoのエミュレート用のfor文
\r
81 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {
\r
85 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {
\r
89 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {
\r
93 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {
\r
97 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {
\r
101 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {
\r
105 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {
\r
109 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {
\r
114 BufferedImage b=new BufferedImage(width,height,ColorSpace.TYPE_RGB);
\r
115 NyARRasterImageIO.copy(i_raster, b);
\r
116 ImageIO.write(b,"png",new File("bug.png"));
\r
117 }catch(Exception e){
\r
120 //8方向全て調べたけどラベルが無いよ?
\r
121 throw new NyARException();
\r
126 for (i = 0; i < 8; i++){
\r
127 final int x=c + xdir[dir];
\r
128 final int y=r + ydir[dir];
\r
130 if(x>=0 && x<width && y>=0 && y<height){
\r
131 if (i_buf[(y)*width+(x)] == 0) {
\r
135 dir++;//倍長テーブルを参照するので問題なし
\r
138 //8方向全て調べたけどラベルが無いよ?
\r
139 throw new NyARException();// return(-1);
\r
143 dir=dir% 8;//dirの正規化
\r
145 // xcoordとycoordをc,rにも保存
\r
148 o_coord_x[coord_num] = c;
\r
149 o_coord_y[coord_num] = r;
\r
151 if (c == i_entry_x && r == i_entry_y){
\r
156 if (coord_num == i_array_size) {
\r
163 public int getContour(NyARLabelingImage i_raster,int i_entry_x,int i_entry_y,int i_array_size,int[] o_coord_x,int[] o_coord_y) throws NyARException
\r
165 final int[] xdir = _getContour_xdir;// static int xdir[8] = { 0, 1, 1, 1, 0,-1,-1,-1};
\r
166 final int[] ydir = _getContour_ydir;// static int ydir[8] = {-1,-1, 0, 1, 1, 1, 0,-1};
\r
168 final int[] i_buf=(int[])i_raster.getBufferReader().getBuffer();
\r
169 final int width=i_raster.getWidth();
\r
170 final int height=i_raster.getHeight();
\r
171 //クリップ領域の上端に接しているポイントを得る。
\r
180 int c = o_coord_x[0];
\r
181 int r = o_coord_y[0];
\r
183 dir = (dir + 5) % 8;//dirの正規化
\r
184 //ここは頑張ればもっと最適化できると思うよ。
\r
185 //4隅以外の境界接地の場合に、境界チェックを省略するとかね。
\r
186 if(c>=1 && c<width-1 && r>=1 && r<height-1){
\r
187 for(;;){//gotoのエミュレート用のfor文
\r
189 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {
\r
193 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {
\r
197 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {
\r
201 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {
\r
205 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {
\r
209 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {
\r
213 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {
\r
217 if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {
\r
220 //8方向全て調べたけどラベルが無いよ?
\r
221 throw new NyARException();
\r
226 for (i = 0; i < 8; i++){
\r
227 final int x=c + xdir[dir];
\r
228 final int y=r + ydir[dir];
\r
230 if(x>=0 && x<width && y>=0 && y<height){
\r
231 if (i_buf[(y)*width+(x)] > 0) {
\r
235 dir++;//倍長テーブルを参照するので問題なし
\r
238 //8方向全て調べたけどラベルが無いよ?
\r
239 throw new NyARException();// return(-1);
\r
243 dir=dir% 8;//dirの正規化
\r
245 // xcoordとycoordをc,rにも保存
\r
248 o_coord_x[coord_num] = c;
\r
249 o_coord_y[coord_num] = r;
\r
251 if (c == sx && r == sy){
\r
256 if (coord_num == i_array_size) {
\r