{"id":894,"date":"2012-05-23T08:36:33","date_gmt":"2012-05-22T23:36:33","guid":{"rendered":"http:\/\/www.digifie.jp\/blog\/?p=894"},"modified":"2012-05-23T08:36:33","modified_gmt":"2012-05-22T23:36:33","slug":"processing-%e3%81%a7-kinect-%e3%82%84-xtion-%e3%81%8c%e4%bd%bf%e3%81%88%e3%82%8b-simple-opaneni-%e3%82%92%e8%a9%a6%e3%81%97%e3%81%a6%e3%81%bf%e3%81%be%e3%81%97%e3%81%9f","status":"publish","type":"post","link":"https:\/\/www.digifie.jp\/blog\/archives\/894","title":{"rendered":"Processing \u3067 Kinect \u3084 Xtion \u304c\u4f7f\u3048\u308b Simple OpaneNI \u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u305f"},"content":{"rendered":"<div class='wp_social_bookmarking_light'>        <div class=\"wsbl_facebook\"><a href='http:\/\/www.facebook.com\/share.php?u=https%3A%2F%2Fwww.digifie.jp%2Fblog%2Farchives%2F894&t=Processing%20%E3%81%A7%20Kinect%20%E3%82%84%20Xtion%20%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8B%20Simple%20OpaneNI%20%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F' title='Facebook \u306b\u30b7\u30a7\u30a2' rel=nofollow class='wp_social_bookmarking_light_a' target=_blank><img src='https:\/\/www.digifie.jp\/blog\/wp-content\/plugins\/wp-social-bookmarking-light\/public\/images\/facebook.png' alt='Facebook \u306b\u30b7\u30a7\u30a2' title='Facebook \u306b\u30b7\u30a7\u30a2' width='16' height='16' class='wp_social_bookmarking_light_img' \/><\/a><\/div>        <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"https:\/\/www.digifie.jp\/blog\/archives\/894\" data-text=\"Processing \u3067 Kinect \u3084 Xtion \u304c\u4f7f\u3048\u308b Simple OpaneNI \u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\" data-via=\"LLC DigiFie\" data-lang=\"ja\">Tweet<\/a><\/div><\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n<p>Procesing \u304b\u3089 Kinect \u3084 Xtion \u3092\u4f7f\u3048\u308b\u3088\u3046\u306b\u3059\u308b SImple OpenNI\uff08<a href=\"http:\/\/code.google.com\/p\/simple-openni\/\" target=\"_blank\">http:\/\/code.google.com\/p\/simple-openni\/<\/a>\uff09\u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>\u4eca\u56de\u306f\u4ee5\u524d\u52c9\u5f37\u4f1a\u7528\u306b\u4f5c\u3063\u305f\u3053\u308c\uff08<a href=\"http:\/\/www.digifie.jp\/blog\/archives\/579\" target=\"_blank\">http:\/\/www.digifie.jp\/blog\/archives\/579<\/a>\uff09\u3092 Simple OpenNI \u7248\u306b\u6539\u9020\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>OpenNI \u7248\u3067\u306f\u2026<\/p>\n<p>\u30fbXtion \u3068 Flash<br \/>\n\u3000\u3000Xtion\uff08OpenNI\uff09\u2192 AIR2.0\uff08NativeProcess\uff09\u3092\u4f7f\u7528\u3057\u3066\u2026<br \/>\n\u3000\u3000Xtion \u3067\u53d6\u5f97\u3057\u305f\u624b\u306e\u5ea7\u6a19\u3092\u9001\u4fe1\u3059\u308b\u7c21\u6613\u30b5\u30fc\u30d0\u3092\u3064\u304f\u308a\u2026<br \/>\n\u3000\u3000RTMFP \u3067 Flash \u306b\u5024\u3092\u9001\u4fe1\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3068\u3044\u3046\u624b\u9806\u3067 Flash \u306b Xtion \u304b\u3089\u53d6\u5f97\u3057\u305f\u5ea7\u6a19\u60c5\u5831\u3092\u9001\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001<br \/>\n\u4eca\u56de\u306e Simple OpenNI \u7248\u3067\u306f\u2026<\/p>\n<p>\u30fbXtion \u3068 Flash<br \/>\n\u3000\u3000Xtion\uff08Simple OpenNI\uff09\u2192 TCP\u30bd\u30b1\u30c3\u30c8\u3092\u4f5c\u3063\u3066\u2026<br \/>\n\u3000\u3000\u30bd\u30b1\u30c3\u30c8\u7d4c\u7531 \u3067 Flash \u306b\u5024\u3092\u9001\u4fe1\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u7c21\u5358\u3067\u3059\u306d\u3002<br \/>\n\u3068\u3044\u3046\u308f\u3051\u3067\u3001\u3053\u3093\u306a\u611f\u3058\u3067\u52d5\u304f\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<br \/>\n\u4ee5\u524d\u306e OpenNI \u7248\u3068\u540c\u69d8 RTMFP \u7d4c\u7531\u3067 iPhone \u3082\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u3053\u306e\u90e8\u5206\u306b\u3064\u3044\u3066\u306f <a href=\"http:\/\/www.digifie.jp\/blog\/archives\/579\" target=\"_blank\">\u3053\u308c<\/a> \u3068\u540c\u3058\u3067\u3059\u3002<br \/>\n\u3000<br \/>\n<iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"http:\/\/www.youtube.com\/embed\/q4W28aa-DxE\" frameborder=\"0\" allowfullscreen><\/iframe><br \/>\n\u3000<br \/>\n\u305d\u3057\u3066\u4eca\u56de\u4f7f\u7528\u3057\u305f Processing \u306e\u30b3\u30fc\u30c9\u3067\u3059\u3002<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">import SimpleOpenNI.*;\r\nimport processing.net.*;\r\n\r\n\r\nSimpleOpenNI      context;\r\n\r\n\/\/ NITE\r\nXnVSessionManager sessionManager;\r\nXnVFlowRouter     flowRouter;\r\n\r\nPointDrawer       pointDrawer;\r\n\r\n\/\/\r\nServer server ;\r\nClient client ;\r\nBoolean isPointTracking;\r\n\r\nvoid setup()\r\n{\r\n  context = new SimpleOpenNI(this);\r\n   \r\n  \/\/ mirror is by default enabled\r\n  context.setMirror(true);\r\n  \r\n  \/\/ enable depthMap generation \r\n  if(context.enableDepth() == false)\r\n  {\r\n     println(&quot;Can't open the depthMap, maybe the camera is not connected!&quot;); \r\n     exit();\r\n     return;\r\n  }\r\n  \r\n  \/\/ enable the hands + gesture\r\n  context.enableGesture();\r\n  context.enableHands();\r\n \r\n  \/\/ setup NITE \r\n  sessionManager = context.createSessionManager(&quot;Click,Wave&quot;, &quot;RaiseHand&quot;);\r\n\r\n  pointDrawer = new PointDrawer();\r\n  flowRouter = new XnVFlowRouter();\r\n  flowRouter.SetActive(pointDrawer);\r\n  \r\n  sessionManager.AddListener(flowRouter);\r\n           \r\n  size(context.depthWidth(), context.depthHeight()); \r\n  smooth();\r\n  \r\n  server = new Server(this, 5204) ;\r\n}\r\n\r\nvoid draw()\r\n{\r\n  background(200,0,0);\r\n  \/\/ update the cam\r\n  context.update();\r\n  \r\n  \/\/ update nite\r\n  context.update(sessionManager);\r\n  \r\n  \/\/ draw depthImageMap\r\n  image(context.depthImage(),0,0);\r\n  \r\n  \/\/ draw the list\r\n  pointDrawer.draw();\r\n}\r\n\r\nvoid keyPressed()\r\n{\r\n  switch(key)\r\n  {\r\n  case 'e':\r\n    \/\/ end sessions\r\n    sessionManager.EndSession();\r\n    println(&quot;end session&quot;);\r\n    break;\r\n  }\r\n}\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/\/ session callbacks\r\n\r\nvoid onStartSession(PVector pos)\r\n{\r\n  println(&quot;onStartSession: &quot; + pos);\r\n}\r\n\r\nvoid onEndSession()\r\n{\r\n  println(&quot;onEndSession: &quot;);\r\n}\r\n\r\nvoid onFocusSession(String strFocus,PVector pos,float progress)\r\n{\r\n  println(&quot;onFocusSession: focus=&quot; + strFocus + &quot;,pos=&quot; + pos + &quot;,progress=&quot; + progress);\r\n}\r\n\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/\/ PointDrawer keeps track of the handpoints\r\n\r\nclass PointDrawer extends XnVPointControl\r\n{\r\n  HashMap    _pointLists;\r\n  int        _maxPoints;\r\n  color[]    _colorList = { color(255,0,0),color(0,255,0),color(0,0,255),color(255,255,0)};\r\n  \r\n  \r\n  public PointDrawer()\r\n  {\r\n    _maxPoints = 30;\r\n    _pointLists = new HashMap();\r\n  }\r\n\t\r\n  public void OnPointCreate(XnVHandPointContext cxt)\r\n  {\r\n    \/\/ create a new list\r\n    addPoint(cxt.getNID(),new PVector(cxt.getPtPosition().getX(),cxt.getPtPosition().getY(),cxt.getPtPosition().getZ()));\r\n    \r\n    println(&quot;OnPointCreate, handId: &quot; + cxt.getNID());\r\n  }\r\n  \r\n  public void OnPointUpdate(XnVHandPointContext cxt)\r\n  {\r\n    \/\/println(&quot;OnPointUpdate &quot; + cxt.getPtPosition());   \r\n    addPoint(cxt.getNID(),new PVector(cxt.getPtPosition().getX(),cxt.getPtPosition().getY(),cxt.getPtPosition().getZ()));\r\n  }\r\n  \r\n  public void OnPointDestroy(long nID)\r\n  {\r\n    println(&quot;OnPointDestroy, handId: &quot; + nID);\r\n    \r\n    \/\/ remove list\r\n    if(_pointLists.containsKey(nID))\r\n       _pointLists.remove(nID);\r\n  }\r\n  \r\n  public ArrayList getPointList(long handId)\r\n  {\r\n    ArrayList curList;\r\n    if(_pointLists.containsKey(handId))\r\n      curList = (ArrayList)_pointLists.get(handId);\r\n    else\r\n    {\r\n      curList = new ArrayList(_maxPoints);\r\n      _pointLists.put(handId,curList);\r\n    }\r\n    return curList;  \r\n  }\r\n  \r\n  public void addPoint(long handId,PVector handPoint)\r\n  {\r\n    ArrayList curList = getPointList(handId);\r\n    \r\n    curList.add(0,handPoint);      \r\n    if(curList.size() &gt; _maxPoints)\r\n      curList.remove(curList.size() - 1);\r\n  }\r\n  \r\n  public void draw()\r\n  {\r\n    if(_pointLists.size() &lt;= 0)\r\n    {\r\n      isPointTracking = false;\r\n      return;\r\n    }\r\n    else\r\n    {\r\n      isPointTracking = true;\r\n    }\r\n      \r\n    pushStyle();\r\n      noFill();\r\n      \r\n      PVector vec;\r\n      PVector firstVec;\r\n      PVector screenPos = new PVector();\r\n      int colorIndex=0;\r\n      \r\n      \/\/ draw the hand lists\r\n      Iterator&lt;Map.Entry&gt; itrList = _pointLists.entrySet().iterator();\r\n      while(itrList.hasNext()) \r\n      {\r\n        strokeWeight(2);\r\n        stroke(_colorList[colorIndex % (_colorList.length - 1)]);\r\n\r\n        ArrayList curList = (ArrayList)itrList.next().getValue();     \r\n        \r\n        \/\/ draw line\r\n        firstVec = null;\r\n        Iterator&lt;PVector&gt; itr = curList.iterator();\r\n        beginShape();\r\n          while (itr.hasNext()) \r\n          {\r\n            vec = itr.next();\r\n            if(firstVec == null)\r\n              firstVec = vec;\r\n            \/\/ calc the screen pos\r\n            context.convertRealWorldToProjective(vec,screenPos);\r\n            vertex(screenPos.x,screenPos.y); \r\n            \/\/println(&quot;X:&quot; + screenPos.x + &quot; Y:&quot; + screenPos.y);   \r\n          } \r\n        endShape();   \r\n  \r\n        \/\/ draw current pos of the hand\r\n        if(firstVec != null)\r\n        {\r\n          strokeWeight(8);\r\n          context.convertRealWorldToProjective(firstVec,screenPos);\r\n          point(screenPos.x, screenPos.y);\r\n        }\r\n        colorIndex++;\r\n      }\r\n      \r\n    popStyle();\r\n    \r\n    updateSocket(screenPos.x,screenPos.y); \r\n  }\r\n  \r\n  \/\/ ----- Socket Sender ------ \r\n  void updateSocket(float px, float py) \r\n  {\r\n    if( !isPointTracking ) return;\r\n    String str = int(px) + &quot;,&quot; + int(py);\r\n    server.write(str) ;\r\n    println(str);\r\n  }\r\n  \r\n  \r\n  \/\/ ----- Socket Receiver ------\r\n  void receivedSocket()\r\n  {\r\n    if (client != null) \r\n    {\r\n      String data = client.readString();\r\n      \r\n      if (data != null) \r\n      {\r\n        println(data);\r\n        \/\/rcvString = data;\r\n      }\r\n    }\r\n  }\r\n  \r\n  void serverEvent(Server srv, Client clt) \r\n  {\r\n    println(&quot;connected&quot;) ;\r\n    if (client != null) server.disconnect(client) ;\r\n    client = clt ;\r\n  }\r\n\r\n}\r\n<\/pre>\n<p>Simple OpenNI \u306b\u4ed8\u3044\u3066\u3044\u305f Hands.pde \u306b\u30bd\u30b1\u30c3\u30c8\u9001\u4fe1\u90e8\u5206\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>Flash \u5074\u306e\u30bd\u30b1\u30c3\u30c8\u53d7\u4fe1\u90e8\u5206\u306f\u3053\u3093\u306a\u611f\u3058\u3002<\/p>\n<pre class=\"brush: as3; title: ; notranslate\" title=\"\">private var _sock:Socket;\r\nprivate var magniX:Number = 1024 \/ 640;\r\nprivate var magniY:Number = 768 \/ 480;\r\nprivate var _px:int;\r\nprivate var _py:int;\r\n\t\t\r\n\/\/ setup\r\nprivate function socketSetup():void\r\n{\r\n\t_sock = new Socket();\r\n\t_sock.addEventListener( IOErrorEvent.IO_ERROR, ioError );\r\n\t_sock.addEventListener( ProgressEvent.SOCKET_DATA, receive_data );\r\n\t_sock.connect( &quot;localhost&quot;, 5204 );\r\n\t\r\n\tfunction ioError( e:IOErrorEvent ):void\r\n\t{\r\n\t\ttrace( e );\r\n\t}\r\n\t\r\n}\r\n\t\t\r\n\/\/ receiver\r\nprivate function receive_data(e:ProgressEvent):void\r\n{\r\n\tvar str:String = _sock.readMultiByte( _sock.bytesAvailable, &quot;utf-8&quot; );\r\n\tvar list:Array = str.split( &quot;,&quot; );\r\n\t\r\n\tif(list[0] &gt;= 0 &amp;&amp; list[1] &gt;= 0) \r\n\t{\r\n\t\t_px = list[0] * magniX;\r\n\t\t_py = list[1] * magniY;\r\n\t}\r\n}\r\n<\/pre>\n<p>\u540c\u3058\u3088\u3046\u306a\u65b9\u6cd5\u3067\u30b9\u30b1\u30eb\u30c8\u30f3\u30c8\u30e9\u30ad\u30f3\u30b0\u3067\u53d6\u5f97\u3057\u305f\u95a2\u7bc0\u306e\u60c5\u5831\u3082\u6bd4\u8f03\u7684\u7c21\u5358\u306b\u53d6\u5f97\u3067\u304d\u308b\u306e\u3067\u3001\u30b9\u30b1\u30eb\u30c8\u30f3\u306e\u60c5\u5831\u3092\u4f7f\u7528\u3057\u3066\u30b3\u30f3\u30c6\u30f3\u30c4\u7684\u306b\u6210\u7acb\u3059\u308b\u3088\u3046\u306a\u30cd\u30bf\u304c\u51fa\u6765\u305f\u3089\uff08\u4eca\u306f\u30cd\u30bf\u304c\u3042\u308a\u307e\u305b\u3093\u306e\u3067\u2026\uff09\u3053\u3061\u3089\u3082\u8a66\u3057\u3066\u307f\u3088\u3046\u3068\u601d\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<div class='wp_social_bookmarking_light'>        <div class=\"wsbl_facebook\"><a href='http:\/\/www.facebook.com\/share.php?u=https%3A%2F%2Fwww.digifie.jp%2Fblog%2Farchives%2F894&t=Processing%20%E3%81%A7%20Kinect%20%E3%82%84%20Xtion%20%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8B%20Simple%20OpaneNI%20%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F' title='Facebook \u306b\u30b7\u30a7\u30a2' rel=nofollow class='wp_social_bookmarking_light_a' target=_blank><img src='https:\/\/www.digifie.jp\/blog\/wp-content\/plugins\/wp-social-bookmarking-light\/public\/images\/facebook.png' alt='Facebook \u306b\u30b7\u30a7\u30a2' title='Facebook \u306b\u30b7\u30a7\u30a2' width='16' height='16' class='wp_social_bookmarking_light_img' \/><\/a><\/div>        <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"https:\/\/www.digifie.jp\/blog\/archives\/894\" data-text=\"Processing \u3067 Kinect \u3084 Xtion \u304c\u4f7f\u3048\u308b Simple OpaneNI \u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\" data-via=\"LLC DigiFie\" data-lang=\"ja\">Tweet<\/a><\/div><\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>Procesing \u304b\u3089 Kinect \u3084 Xtion \u3092\u4f7f\u3048\u308b\u3088\u3046\u306b\u3059\u308b SImple OpenNI\uff08http:\/\/code.google.com\/p\/simple-openni\/\uff09\u3092\u8a66\u3057\u3066\u307f\u307e\u3057\u305f\u3002 \u4eca\u56de\u306f\u4ee5\u524d\u52c9\u5f37\u4f1a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3,27,34,29],"tags":[],"_links":{"self":[{"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/posts\/894"}],"collection":[{"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/comments?post=894"}],"version-history":[{"count":4,"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/posts\/894\/revisions"}],"predecessor-version":[{"id":898,"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/posts\/894\/revisions\/898"}],"wp:attachment":[{"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/media?parent=894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/categories?post=894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.digifie.jp\/blog\/wp-json\/wp\/v2\/tags?post=894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}