OSDN Git Service

3d0ee5a1a288e5a2c35cff10e5e77364d8daa297
[nyartoolkit-and/nyartoolkit-and.git] / sample / jogl / src.rpf / jp / nyatla / nyartoolkit / rpf / sample / Test_RealityTarget.java
1 package jp.nyatla.nyartoolkit.rpf.sample;\r
2 \r
3 import java.awt.*;\r
4 import java.awt.event.MouseEvent;\r
5 import java.awt.event.MouseListener;\r
6 import java.awt.image.*;\r
7 import java.io.File;\r
8 import java.io.IOException;\r
9 \r
10 import javax.imageio.ImageIO;\r
11 \r
12 import jp.nyatla.nyartoolkit.NyARException;\r
13 import jp.nyatla.nyartoolkit.core.param.NyARParam;\r
14 import jp.nyatla.nyartoolkit.core.raster.NyARGrayscaleRaster;\r
15 import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster;\r
16 import jp.nyatla.nyartoolkit.core.types.NyARBufferType;\r
17 import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint3d;\r
18 import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;\r
19 import jp.nyatla.nyartoolkit.core.types.NyARIntRect;\r
20 import jp.nyatla.nyartoolkit.rpf.mklib.ARTKMarkerTable;\r
21 import jp.nyatla.nyartoolkit.rpf.reality.nyartk.NyARReality;\r
22 import jp.nyatla.nyartoolkit.rpf.reality.nyartk.NyARRealityTarget;\r
23 import jp.nyatla.nyartoolkit.rpf.reality.nyartk.NyARRealityTargetList;\r
24 import jp.nyatla.nyartoolkit.rpf.realitysource.nyartk.NyARRealitySource;\r
25 import jp.nyatla.nyartoolkit.rpf.realitysource.nyartk.NyARRealitySource_JavaImage;\r
26 import jp.nyatla.nyartoolkit.rpf.realitysource.nyartk.NyARRealitySource_Jmf;\r
27 import jp.nyatla.nyartoolkit.rpf.tracker.nyartk.status.NyARRectTargetStatus;\r
28 import jp.nyatla.nyartoolkit.rpf.tracker.nyartk.status.NyARTargetStatus;\r
29 import jp.nyatla.nyartoolkit.jmf.utils.*;\r
30 import jp.nyatla.nyartoolkit.utils.j2se.*;\r
31 \r
32 \r
33 \r
34 \r
35 \r
36 /**\r
37  * NyARRealityのテストプログラム。動作保証なし。\r
38  *\r
39  */\r
40 \r
41 public class Test_RealityTarget extends Frame implements MouseListener\r
42 {\r
43         /**\r
44          * 出力ソース\r
45          * @author nyatla\r
46          */\r
47         class InputSource\r
48         {\r
49                 public NyARRealitySource reality_in;\r
50         }\r
51 \r
52         class ImageSource extends InputSource\r
53         {\r
54                 public ImageSource(String i_filename) throws NyARException, IOException\r
55                 {\r
56                         BufferedImage _src_image;\r
57                         _src_image = ImageIO.read(new File(i_filename));\r
58                         NyARRealitySource_JavaImage ri=new NyARRealitySource_JavaImage(_src_image.getWidth(),_src_image.getHeight(),null,2,100);\r
59                         ri.getBufferedImage().getGraphics().drawImage(_src_image,0,0,null);\r
60                         this.reality_in=ri;\r
61                 }\r
62         }\r
63 \r
64         class LiveSource extends InputSource implements JmfCaptureListener\r
65         {\r
66                 private JmfCaptureDevice _capture;\r
67                 public LiveSource() throws NyARException\r
68                 {\r
69                         //キャプチャの準備\r
70                         JmfCaptureDeviceList devlist=new JmfCaptureDeviceList();\r
71                         this._capture=devlist.getDevice(0);\r
72                         //JmfNyARRaster_RGBはYUVよりもRGBで高速に動作します。\r
73                         if(!this._capture.setCaptureFormat(JmfCaptureDevice.PIXEL_FORMAT_RGB,320, 240,15f)){\r
74                                 if(!this._capture.setCaptureFormat(JmfCaptureDevice.PIXEL_FORMAT_YUV,320, 240,15f)){\r
75                                         throw new NyARException("キャプチャフォーマットが見つかりません");\r
76                                 }               \r
77                         }\r
78                         this._capture.setOnCapture(this);\r
79                         this._capture.start();\r
80                         this.reality_in=new NyARRealitySource_Jmf(this._capture.getCaptureFormat(),null,2,100);\r
81                         return;\r
82                         \r
83                 }\r
84                 \r
85                 public void onUpdateBuffer(javax.media.Buffer i_buffer)\r
86                 {\r
87                         try {\r
88                                 //キャプチャしたバッファをラスタにセット\r
89                                 synchronized(this.reality_in){\r
90                                         ((NyARRealitySource_Jmf)(this.reality_in)).setImage(i_buffer);\r
91                                 }\r
92                                 //キャプチャしたイメージを表示用に加工\r
93                         }catch(Exception e)\r
94                         {\r
95                                 e.printStackTrace();\r
96                         }\r
97 \r
98                 }\r
99 \r
100                 public void startCapture()\r
101                 {\r
102                         try {\r
103                                 this._capture.start();\r
104                         } catch (Exception e) {\r
105                                 e.printStackTrace();\r
106                         }\r
107                 }\r
108         }\r
109         \r
110         public void mouseClicked(MouseEvent e)\r
111         {\r
112                 try {\r
113                 int x=e.getX()-this.getInsets().left;\r
114                 int y=e.getY()-this.getInsets().top;\r
115                 System.out.println(x+":"+y);\r
116                 synchronized(this._input_source.reality_in)\r
117                 {\r
118                         NyARBufferedImageRaster bmp= new NyARBufferedImageRaster(100,100,NyARBufferType.BYTE1D_R8G8B8_24);\r
119                         for(int i=this._reality.refTargetList().getLength()-1;i>=0;i--)\r
120                         {\r
121                                 NyARRealityTarget rt=this._reality.refTargetList().getItem(i);\r
122                                 if(rt._target_type!=NyARRealityTarget.RT_UNKNOWN && rt._target_type!=NyARRealityTarget.RT_KNOWN){\r
123                                         continue;\r
124                                 }\r
125                                 if(rt.isInnerVertexPoint2d(x, y))\r
126                                 {\r
127                                         if(e.getButton()==MouseEvent.BUTTON1){\r
128                                                 //左ボタンはUNKNOWN→KNOWN\r
129                                                 if(rt._target_type==NyARRealityTarget.RT_UNKNOWN){\r
130                                                         ARTKMarkerTable.GetBestMatchTargetResult r=new ARTKMarkerTable.GetBestMatchTargetResult();\r
131                                                         if(this._mklib.getBestMatchTarget(rt,this._input_source.reality_in,r)){\r
132                                                                 this._reality.changeTargetToKnown(rt,r.artk_direction,80);\r
133                                                         }\r
134                                                                 //イメージピックアップの実験\r
135                                                                 NyARIntPoint2d[] iv=NyARIntPoint2d.createArray(4);\r
136                                                                 for(int i2=0;i2<4;i2++){\r
137                                                                         iv[i2].x=(int)rt.refTargetVertex()[i2].x;\r
138                                                                         iv[i2].y=(int)rt.refTargetVertex()[i2].y;\r
139                                                                 }\r
140                                                                 System.out.println(">>");\r
141                                                                 NyARRgbRaster rgb=new NyARRgbRaster(320,240,NyARBufferType.BYTE1D_R8G8B8_24);\r
142                                                                 //2d座標系\r
143                                                                 {\r
144                                                                         this._reality.getRgbPatt2d(this._input_source.reality_in,rt.refTargetVertex(),1,bmp);\r
145                                                                         this.getGraphics().drawImage(bmp.getBufferedImage(),this.getInsets().left,this.getInsets().top+240,null);\r
146                                                                 }\r
147                                                                 //3d(カメラ)\r
148                                                                 {\r
149                                                                         NyARDoublePoint3d[] p=NyARDoublePoint3d.createArray(4);\r
150                                                                         p[3].x=-40;p[3].y=-40;p[3].z=0;\r
151                                                                         p[2].x=40; p[2].y=-40;p[2].z=0;\r
152                                                                         p[1].x=40; p[1].y=40 ;p[1].z=0;\r
153                                                                         p[0].x=-40;p[0].y=40 ;p[0].z=0;\r
154                                                                         this._reality.getRgbPatt3d(this._input_source.reality_in,p, rt.refTransformMatrix(), 1, bmp);\r
155                                                                         this.getGraphics().drawImage(bmp.getBufferedImage(),this.getInsets().left+100,this.getInsets().top+240,null);\r
156                                                                 }\r
157                                                                 //3d(Target)\r
158                                                                 {\r
159                                                                         NyARDoublePoint3d[] p=NyARDoublePoint3d.createArray(4);\r
160                                                                         p[3].x=-40;p[3].y=-40;p[3].z=0;\r
161                                                                         p[2].x=40; p[2].y=-40;p[2].z=0;\r
162                                                                         p[1].x=40; p[1].y=40 ;p[1].z=0;\r
163                                                                         p[0].x=-80;p[0].y=40 ;p[0].z=0;\r
164                                                                         rt.getRgbPatt3d(this._input_source.reality_in,p,null, 1, bmp);\r
165                                                                         this.getGraphics().drawImage(bmp.getBufferedImage(),this.getInsets().left+200,this.getInsets().top+240,null);\r
166                                                                 }\r
167                                                                 //3d(Target)\r
168                                                                 {\r
169                                                                         rt.getRgbRectPatt3d(this._input_source.reality_in,-80,-80,80,80,1, bmp);\r
170                                                                         this.getGraphics().drawImage(bmp.getBufferedImage(),this.getInsets().left+300,this.getInsets().top+240,null);\r
171                                                                 }\r
172                                                         break;\r
173                                                 }\r
174                                         }else if(e.getButton()==MouseEvent.BUTTON3){\r
175                                                 //右ボタンはUNKNOWN or KNOWN to dead\r
176                                                 try {\r
177                                                         this._reality.changeTargetToDead(rt);\r
178                                                         break;\r
179                                                 } catch (NyARException e1) {\r
180                                                         // TODO Auto-generated catch block\r
181                                                         e1.printStackTrace();\r
182                                                 }\r
183                                         }\r
184                                 }\r
185                         }\r
186                 }\r
187                 } catch (NyARException e1) {\r
188                         // TODO Auto-generated catch block\r
189                         e1.printStackTrace();\r
190                 }\r
191         }\r
192         public void mouseEntered(MouseEvent e){}\r
193         public void mouseExited(MouseEvent e){}\r
194         public void mousePressed(MouseEvent e){}\r
195         public void mouseReleased(MouseEvent e){}\r
196         ARTKMarkerTable _mklib; \r
197         \r
198         \r
199         private NyARReality _reality;\r
200 \r
201         \r
202         \r
203         NyARParam _param;\r
204         \r
205         private final static String SAMPLE_FILES = "../Data/320x240ABGR.png";\r
206         private final static String PARAM_FILE = "../Data/camera_para.dat";\r
207 \r
208         private static final long serialVersionUID = -2110888320986446576L;\r
209 \r
210 \r
211         private int W = 320;\r
212         private int H = 240;\r
213         InputSource _input_source;\r
214         public Test_RealityTarget() throws NyARException, Exception\r
215         {\r
216                 setTitle("NyARReality test");\r
217                 Insets ins = this.getInsets();\r
218                 this.setSize(1024 + ins.left + ins.right, 768 + ins.top + ins.bottom);\r
219                 this._param=new NyARParam();\r
220                 this._param.loadARParamFromFile(PARAM_FILE);\r
221                 this._param.changeScreenSize(W,H);\r
222                 this._reality=new NyARReality(this._param.getScreenSize(),10,1000,this._param.getPerspectiveProjectionMatrix(),null,10,10);\r
223 //              this._input_source=new LiveSource();\r
224                 this._input_source=new ImageSource(SAMPLE_FILES);\r
225                 addMouseListener(this);\r
226                 this._mklib= new ARTKMarkerTable(10,16,16,25,25,4);\r
227                 this._mklib.addMarkerFromARPattFile(PATT_HIRO,0,"HIRO",80,80);\r
228                 return;\r
229         }       \r
230 \r
231     public void update()\r
232     {\r
233                 try {\r
234                         // マーカーを検出\r
235                         Thread.sleep(30);\r
236                         synchronized(this._input_source.reality_in){\r
237 //                              Date d2 = new Date();\r
238 //                              for (int i = 0; i < 1000; i++) {\r
239                                         this._reality.progress(this._input_source.reality_in);                  \r
240 //                              }\r
241 //                              Date d = new Date();\r
242 //                              System.out.println(d.getTime() - d2.getTime());\r
243                         }\r
244                 } catch (Exception e) {\r
245                         e.printStackTrace();\r
246                 }\r
247     }\r
248     BufferedImage _tmp_bf=new BufferedImage(320,240,BufferedImage.TYPE_INT_RGB);\r
249     private void draw(Graphics ig) throws NyARException\r
250     {\r
251         //ウインドウの情報\r
252                 Insets ins = this.getInsets();\r
253 \r
254         //ワーク画面\r
255         BufferedImage bmp=this._tmp_bf;\r
256         Graphics g=bmp.getGraphics();\r
257         NyARRasterImageIO.copy(this._input_source.reality_in.refRgbSource(),bmp);\r
258         \r
259         //Ignore,Coord,New\r
260 \r
261         //表示\r
262         g.setColor(Color.black);\r
263         g.drawString("Unknown:"+this._reality.getNumberOfUnknown(),200,200);\r
264         g.drawString("Known:"+this._reality.getNumberOfKnown(),200,210);\r
265         g.drawString("Dead:"+this._reality.getNumberOfDead(),200,220);\r
266                 NyARRealityTargetList tl=this._reality.refTargetList();\r
267                 for(int i=tl.getLength()-1;i>=0;i--){\r
268                         NyARRealityTarget t=tl.getItem(i);\r
269                         switch(t.getTargetType())\r
270                         {\r
271                         case NyARRealityTarget.RT_KNOWN:\r
272                                 drawKnownRT(g,t);\r
273                                 break;\r
274                         case NyARRealityTarget.RT_UNKNOWN:                              \r
275                                 drawUnKnownRT(g,t);\r
276                                 break;\r
277                         default:\r
278                                 drawDeadRT(g,t);\r
279                                 break;\r
280                         }\r
281                 }       \r
282         ig.drawImage(bmp,ins.left,ins.top,null);\r
283         \r
284 \r
285         drawImage(ig,ins.left+320,ins.top,this._input_source.reality_in.refLastTrackSource().refEdgeRaster());\r
286         //\r
287 \r
288     }\r
289 \r
290     \r
291     private void drawImage(Graphics g,int x,int y,NyARGrayscaleRaster r) throws NyARException\r
292     {\r
293         BufferedImage _tmp_bf=new BufferedImage(r.getWidth(),r.getHeight(),BufferedImage.TYPE_INT_RGB);\r
294         NyARRasterImageIO.copy(r, _tmp_bf);\r
295         g.drawImage(_tmp_bf, x,y, null);\r
296         \r
297     }\r
298     //\r
299     //描画関数\r
300     //\r
301     private void drawKnownRT(Graphics g,NyARRealityTarget t)\r
302     {\r
303         g.setColor(Color.GREEN);\r
304         NyARIntPoint2d b=new NyARIntPoint2d();\r
305         t.getTargetCenter(b);\r
306         NyARIntRect r=t._ref_tracktarget._sample_area;\r
307         g.drawString("[K]("+t.grab_rate+")",b.x,b.y);\r
308                 g.drawRect(r.x,r.y, r.w,r.h);\r
309         if(t._ref_tracktarget._st_type==NyARTargetStatus.ST_RECT){\r
310                 g.drawString(">"+((NyARRectTargetStatus)(t._ref_tracktarget._ref_status)).detect_type,r.x,r.y+10);\r
311         }else{\r
312         }\r
313     }\r
314     private void drawUnKnownRT(Graphics g,NyARRealityTarget t)\r
315     {\r
316         g.setColor(Color.YELLOW);\r
317         NyARIntPoint2d b=new NyARIntPoint2d();\r
318         t.getTargetCenter(b);\r
319         NyARIntRect r=t._ref_tracktarget._sample_area;\r
320         g.drawString("[U]("+t.grab_rate+")",b.x,b.y);\r
321                 g.drawRect(r.x,r.y, r.w,r.h);\r
322         }\r
323     private void drawDeadRT(Graphics g,NyARRealityTarget t)\r
324     {\r
325         g.setColor(Color.RED);\r
326         NyARIntRect r=t._ref_tracktarget._sample_area;\r
327         g.drawString("[D]("+t.grab_rate+")",r.x,r.y);\r
328     }\r
329     \r
330         private final static String PATT_HIRO = "../Data/patt.hiro";\r
331     \r
332 \r
333 \r
334     public void mainloop() throws Exception\r
335     {\r
336         for(;;){\r
337                 //処理\r
338                 this.update();\r
339                 this.draw(this.getGraphics());\r
340         }\r
341     }\r
342 \r
343         public static void main(String[] args)\r
344         {\r
345 \r
346                 try {\r
347                         Test_RealityTarget mainwin = new Test_RealityTarget();\r
348                         mainwin.setVisible(true);\r
349                         mainwin.mainloop();\r
350                         // mainwin.startImage();\r
351                 } catch (Exception e) {\r
352                         e.printStackTrace();\r
353                 }\r
354         }\r
355 }\r
356 \r