OSDN Git Service

7442139aa3ccf65ad1c13f0909e189ee829ca37b
[nyartoolkit-and/nyartoolkit-and.git] / trunk / test / jp / nyatla / nyartoolkit / dev / PattPickupTest.java
1 package jp.nyatla.nyartoolkit.dev;\r
2 \r
3 import java.awt.Color;\r
4 import java.awt.Frame;\r
5 import java.awt.Graphics;\r
6 import java.awt.Image;\r
7 import java.awt.Insets;\r
8 \r
9 import javax.media.Buffer;\r
10 import javax.media.format.VideoFormat;\r
11 import javax.media.util.BufferToImage;\r
12 import java.awt.image.*;\r
13 import jp.nyatla.nyartoolkit.NyARException;\r
14 import jp.nyatla.nyartoolkit.jmf.utils.*;\r
15 import jp.nyatla.nyartoolkit.nyidmarker.NyARIdMarkerPickup;\r
16 import jp.nyatla.nyartoolkit.core.*;\r
17 import jp.nyatla.nyartoolkit.core.param.*;\r
18 import jp.nyatla.nyartoolkit.core.pickup.*;\r
19 import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;\r
20 import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;\r
21 import jp.nyatla.utils.j2se.*;\r
22 import jp.nyatla.nyartoolkit.nyidmarker.*;\r
23 \r
24 public class PattPickupTest extends Frame implements JmfCaptureListener\r
25 {\r
26         private final String PARAM_FILE = "../Data/camera_para.dat";\r
27 \r
28         private static final long serialVersionUID = -2110888320986446576L;\r
29 \r
30         private JmfCaptureDevice _capture;\r
31 \r
32         private JmfNyARRaster_RGB _capraster;\r
33 \r
34         private NyARSquareDetector _detector;\r
35 \r
36         protected INyARRasterFilter_RgbToBin _tobin_filter;\r
37 \r
38         private NyARBinRaster _bin_raster;\r
39 \r
40         private NyARSquareStack _stack = new NyARSquareStack(100);\r
41 \r
42         public PattPickupTest() throws NyARException\r
43         {\r
44                 setTitle("JmfCaptureTest");\r
45                 Insets ins = this.getInsets();\r
46                 this.setSize(640 + ins.left + ins.right, 480 + ins.top + ins.bottom);\r
47                 JmfCaptureDeviceList dl = new JmfCaptureDeviceList();\r
48                 this._capture = dl.getDevice(0);\r
49                 if (!this._capture.setCaptureFormat(JmfCaptureDevice.PIXEL_FORMAT_RGB, 320, 240, 30.0f)) {\r
50                         if (!this._capture.setCaptureFormat(JmfCaptureDevice.PIXEL_FORMAT_YUV, 320, 240, 30.0f)) {\r
51                                 throw new NyARException("キャプチャフォーマットが見つかりません。");\r
52                         }\r
53                 }\r
54                 NyARParam ar_param = new NyARParam();\r
55                 ar_param.loadARParamFromFile(PARAM_FILE);\r
56                 ar_param.changeScreenSize(320, 240);\r
57                 this._capraster = new JmfNyARRaster_RGB(320, 240, this._capture.getCaptureFormat());\r
58                 this._capture.setOnCapture(this);\r
59                 this._detector = new NyARSquareDetector(ar_param.getDistortionFactor(), ar_param.getScreenSize());\r
60                 this._bin_raster = new NyARBinRaster(320, 240);\r
61                 this._tobin_filter = new NyARRasterFilter_ARToolkitThreshold(110);\r
62                 return;\r
63         }\r
64 \r
65         /**\r
66          * 矩形の矩形っぽい点数を返す。\r
67          * \r
68          * @param i_sq\r
69          * @return\r
70          */\r
71         private int getSQPoint(NyARSquare i_sq)\r
72         {\r
73                 int lx1 = i_sq.imvertex[0].x - i_sq.imvertex[2].x;\r
74                 int ly1 = i_sq.imvertex[0].y - i_sq.imvertex[2].y;\r
75                 int lx2 = i_sq.imvertex[1].x - i_sq.imvertex[3].x;\r
76                 int ly2 = i_sq.imvertex[1].y - i_sq.imvertex[3].y;\r
77                 return (int) Math.sqrt((lx1 * lx1) + (ly1 * ly1)) * (int) Math.sqrt(((lx2 * lx2) + (ly2 * ly2)));\r
78         }\r
79 \r
80         private INyARColorPatt _patt1 = new NyARColorPatt_O3(64, 64);\r
81 \r
82         private INyARColorPatt _patt2 = new NyARColorPatt_Perspective(100,100);\r
83 \r
84         private NyARIdMarkerPickup _patt3 = new NyARIdMarkerPickup();\r
85 \r
86         public void onUpdateBuffer(Buffer i_buffer)\r
87         {\r
88                 try {\r
89                         Insets ins = this.getInsets();\r
90                         Graphics g = getGraphics();\r
91 \r
92                         {// ピックアップ画像の表示\r
93                                 // 矩形抽出\r
94                                 this._capraster.setBuffer(i_buffer);\r
95                                 this._tobin_filter.doFilter(this._capraster, this._bin_raster);\r
96                                 this._detector.detectMarker(this._bin_raster, this._stack);\r
97 \r
98                                 int max_point = 0;\r
99                                 NyARSquare t = null;\r
100                                 // ど れ に し よ う か なー\r
101                                 for (int i = this._stack.getLength() - 1; i >= 0; i--) {\r
102                                         NyARSquare sq = (NyARSquare) this._stack.getItem(i);\r
103                                         int wp = getSQPoint(sq);\r
104                                         if (wp < max_point) {\r
105                                                 continue;\r
106                                         }\r
107                                         t = sq;\r
108                                 }\r
109                                 if (t != null) {\r
110 \r
111                                         BufferedImageSink sink = new BufferedImageSink(this._patt1.getWidth(), this._patt1.getHeight());\r
112                                         BufferedImageSink sink2 = new BufferedImageSink(this._patt2.getWidth(), this._patt2.getHeight());\r
113 //                                      BufferedImageSink sink3 = new BufferedImageSink(this._patt3.getWidth(), this._patt3.getHeight());\r
114                                         Graphics g1,g2,g3;\r
115                                         {// ARToolkit\r
116                                                 // 一番それっぽいパターンを取得\r
117                                                 this._patt1.pickFromRaster(this._capraster, t);\r
118                                                 // パターンを書く\r
119                                                 sink.sinkFromRaster(this._patt1);\r
120                                                 g1=sink.getGraphics();\r
121                                                 g1.setColor(Color.red);\r
122                                                 g1.drawLine(this._patt1.getWidth()/2,0,this._patt1.getWidth()/2,this._patt1.getHeight());\r
123                                                 g1.drawLine(0,this._patt1.getHeight()/2,this._patt1.getWidth(),this._patt1.getHeight()/2);\r
124                                         }\r
125                                         {// 疑似アフィン変換\r
126                                                 // 一番それっぽいパターンを取得\r
127                                                 this._patt2.pickFromRaster(this._capraster, t);\r
128                                                 // パターンを書く\r
129                                                 sink2.sinkFromRaster(this._patt2);\r
130                                                 g2=sink2.getGraphics();\r
131                                                 g2.setColor(Color.red);\r
132                                                 g2.drawLine(this._patt1.getWidth()/2,0,this._patt1.getWidth()/2,this._patt1.getHeight());\r
133                                                 g2.drawLine(0,this._patt1.getHeight()/2,this._patt1.getWidth(),this._patt1.getHeight()/2);\r
134                                         }\r
135                                         {// IDマーカ\r
136                                                 NyARIdMarkerData data =new NyARIdMarkerData();\r
137                                                 NyARIdMarkerParam param =new NyARIdMarkerParam();\r
138                                                 \r
139                                                 // 一番それっぽいパターンを取得\r
140                                                 this._patt3.pickFromRaster(this._capraster, t,data,param);\r
141                                                 System.out.println("model="+data.model);\r
142                                                 System.out.println("domain="+data.ctrl_domain);\r
143                                                 System.out.println("maskl="+data.ctrl_mask);\r
144                                                 System.out.println("data= "+data.data[0]+","+data.data[1]+","+data.data[2]);\r
145                                                 // パターンを書く\r
146 /*                                              sink3.sinkFromRaster(this._patt3);\r
147                                                 g3=sink.getGraphics();\r
148                                                 g3.setColor(Color.red);\r
149                                                 g2.drawRect(10,10,10,10);\r
150                                                 g2.drawRect(80,10,10,10);\r
151                                                 g2.drawRect(10,80,10,10);\r
152                                                 g2.drawRect(80,80,10,10);*/\r
153 //                                              g2.drawLine(this._patt3.sv[0]-1,this._patt3.sv[1],this._patt3.sv[0]+1,this._patt3.sv[1]);\r
154 //                                              g2.drawLine(this._patt3.sv[0],this._patt3.sv[1]-1,this._patt3.sv[0],this._patt3.sv[1]+1);\r
155 //                                              g2.drawLine(this._patt3.sv[2]-1,this._patt3.sv[3],this._patt3.sv[2]+1,this._patt3.sv[3]);\r
156 //                                              g2.drawLine(this._patt3.sv[2],this._patt3.sv[3]-1,this._patt3.sv[2],this._patt3.sv[3]+1);\r
157                                                 \r
158                                                 BufferedImage img=new BufferedImage(45,256,     BufferedImage.TYPE_INT_RGB);\r
159 \r
160                                                 g.drawImage(img, ins.left, ins.top+240,45,256, null);\r
161 /*\r
162                                                 g2.setColor(Color.blue);\r
163                                                 for (int i = 0; i < 225*4; i++) {\r
164                                                         g2.drawRect(this._patt3.vertex_x[i]-1,this._patt3.vertex_y[i]-1, 2, 2);\r
165                                                 }\r
166 */                                              g2.setColor(Color.red);\r
167                                                 for (int i = 0; i <4; i++) {\r
168                                                         g2.drawRect(this._patt3.vertex2_x[i]-1,this._patt3.vertex2_y[i]-1, 2, 2);\r
169                                                 }\r
170                                         }\r
171                                         g.drawImage(sink, ins.left + 320, ins.top, 128, 128, null);\r
172                                         g.drawImage(sink2, ins.left + 320, ins.top + 128, 400, 400, null);\r
173 //                                      g.drawImage(sink3, ins.left + 100, ins.top + 240, this._patt3.getWidth() * 10, this._patt3.getHeight() * 10, null);\r
174                                 }\r
175 \r
176                                 {// 撮影画像\r
177                                         BufferToImage b2i = new BufferToImage((VideoFormat) i_buffer.getFormat());\r
178                                         Image img = b2i.createImage(i_buffer);\r
179                                         g.drawImage(img, ins.left, ins.top, this);\r
180                                         g.setColor(Color.blue);\r
181                                         for (int i = 0; i < 225*4; i++) {\r
182                                                 g.drawRect(ins.left+this._patt3.vertex_x[i]-1,ins.top+this._patt3.vertex_y[i]-1, 2, 2);\r
183                                         }\r
184                                 \r
185                                 }\r
186                                 /*\r
187                                  * { //輪郭パターン NyARSquare s=new NyARSquare(); for(int i=0;i<4;i++){ s.imvertex[i].x=(int)t.sqvertex[i].x; s.imvertex[i].y=(int)t.sqvertex[i].y; }\r
188                                  * //一番それっぽいパターンを取得 this._patt1.pickFromRaster(this._capraster,s); //パターンを書く BufferedImageSink sink=new\r
189                                  * BufferedImageSink(this._patt1.getWidth(),this._patt1.getHeight()); sink.sinkFromRaster(this._patt1);\r
190                                  * g.drawImage(sink,ins.left+320,ins.top+128,128,128,null); }\r
191                                  */\r
192                                 {// 信号取得テスト\r
193 \r
194                                 }\r
195                         }\r
196                 } catch (Exception e) {\r
197                         e.printStackTrace();\r
198                 }\r
199         }\r
200 \r
201         public void startCapture()\r
202         {\r
203                 try {\r
204                         this._capture.start();\r
205                 } catch (Exception e) {\r
206                         e.printStackTrace();\r
207                 }\r
208         }\r
209 \r
210         public static void main(String[] args)\r
211         {\r
212                 try {\r
213                         PattPickupTest mainwin = new PattPickupTest();\r
214                         mainwin.setVisible(true);\r
215                         mainwin.startCapture();\r
216                 } catch (Exception e) {\r
217                         e.printStackTrace();\r
218                 }\r
219 \r
220         }\r
221 \r
222 }\r