
Kinect使ってMRIやCRTスキャンの画像を操作できるようです。
これからいろんな現場でジェスチャー操作ができるようになるんでしょうか。
元記事:Gigazin-カナダの医療チームが「Kinect」を外科手術の現場で採用、執刀医の作業負担を大幅に削減


"ユーザーID","部位ID","状態","x座標","y座標","z座標" (Null)
(例)
1,1,add,100.223,600.032,1534,302
1,1,update,140.344,632.323,1523,324
1,1,remove,0,0,0
ユーザーID:1~10
部位ID:1~24
状態:add,update,remove
public function Main():void{
//
//ポインタ生成
mp=new MultiPointer(-1 , false);
mp.simulate=true;
mp.registerDefaultCursor(HandCursor);
addChild(mp);
//
//ボーン描画用
kmu=new KinectMultiUser();
kmu.mouseEnabled=kmu.mouseChildren=false;
addChild(kmu);
//
//FieldOfView設定
fov.addEventListener(Event.ENTER_FRAME , getFOV);
//
//接続開始
connect_btn.addEventListener(MouseEvent.CLICK , connectStart);
//
}
private function connectStart(e:MouseEvent):void{
//
kc=new KinectConnector();
kc.addEventListener(Event.CONNECT , connectComplete);
kc.addEventListener(KinectEvent.RECEIVE , receiveKinectData);
kc.connect(ip.text , int(port.text));
//
}
private function receiveKinectData(e:KinectEvent):void{
//
//受け取ったデータをパースし、ボーンを描画
kmu.parseData(e.data);
//
for(var i:int=0 ; i<kmu.users ; i++){
//
//ユーザーを取得
var ku:KinectUser=kmu.getUserById(i);
if(!ku)continue;
//
//両手を取得
for(var n:int=0 ; n<2 ; n++){
//
//一意のIDを作成
var pointer_id:int=int(String(i+1)+(n+1));
//
var parts:KinectUserParts;
if(n==0){
parts=ku.getPartsById(KinectUserParts.R_HAND);
}else{
parts=ku.getPartsById(KinectUserParts.L_HAND);
}
//
if(!parts){
mp.lost(0,0,pointer_id);
continue;
}
//
//グローバル座標に変換
var p:Point=ku.local3DToGlobal(new Vector3D(parts.x , parts.y , parts.z));
//
//ポインタ認識
mp.detect(p.x,p.y , pointer_id);
//ポインタを動かす
mp.move(p.x,p.y,pointer_id);
if(parts.z>1500){
mp.down(p.x,p.y,pointer_id);
}else{
mp.up(p.x,p.y,pointer_id);
}
//
}
//
}
//
//
}
for(var i:int=0 ; i<kmu.users ; i++){
//
//ユーザーを取得
var ku:KinectUser=kmu.getUserById(i);
if(!ku)continue;
//
//両手を取得
for(var n:int=0 ; n<2 ; n++){
//
//一意のIDを作成
var pointer_id:int=int(String(i+1)+(n+1));
//
var parts:KinectUserParts;
if(n==0){
parts=ku.getPartsById(KinectUserParts.R_HAND);
}else{
parts=ku.getPartsById(KinectUserParts.L_HAND);
}
//
if(!parts){
mp.lost(0,0,pointer_id);
continue;
}
//
//グローバル座標に変換
var p:Point=ku.local3DToGlobal(new Vector3D(parts.x , parts.y , parts.z));
//
//ポインタ認識
mp.detect(p.x,p.y , pointer_id);
//ポインタを動かす
mp.move(p.x,p.y,pointer_id);
if(parts.z<1500){
mp.down(p.x,p.y,pointer_id);
}else{
mp.up(p.x,p.y,pointer_id);
}
//
}
//
}
HEAD = 1 NECK = 2 TORSO = 3 WAIST = 4 LEFT_COLLAR = 5 LEFT_SHOULDER = 6 LEFT_ELBOW = 7 LEFT_WRIST = 8 LEFT_HAND = 9 LEFT_FINGERTIP =10 RIGHT_COLLAR =11 RIGHT_SHOULDER =12 RIGHT_ELBOW =13 RIGHT_WRIST =14 RIGHT_HAND =15 RIGHT_FINGERTIP =16 LEFT_HIP =17 LEFT_KNEE =18 LEFT_ANKLE =19 LEFT_FOOT =20 RIGHT_HIP =21 RIGHT_KNEE =22 RIGHT_ANKLE =23 RIGHT_FOOT =24


//==========================
//コンストラクタ
//==========================
public function Main():void{
//
mp=new MultiPointer(-1 , false);
mp.simulate=true;
mp.registerDefaultCursor(HandCursor);
addChild(mp);
//
connect_btn.addEventListener(MouseEvent.CLICK , connectStart);
//
}
//==========================
//接続開始
//==========================
private function connectStart(e:MouseEvent):void{
//
socket=new XMLSocket();
socket.addEventListener(Event.CONNECT , connectComplete);
socket.addEventListener(DataEvent.DATA , receiveData);
socket.connect(ip.text , int(port.text));
//
}
//
//
//==========================
//接続完了
//==========================
private function connectComplete(e:Event):void{
//接続のためダミーデータを送信(サーバー仕様による)
socket.send("test");
}
//==========================
//データ受信
//==========================
private function receiveData(e:DataEvent):void{
//
//データ解析
var data:Array=e.data.split(",");
var id:int=data[0];
var parts:int=int(data[1]);
var x:Number=Number(data[2]);
var y:Number=Number(data[3]);
var z:Number=Number(data[4]);
//
//一意のIDを作成
var pointer_id:int=int(parts.toString()+id.toString());
//
//ポインタ認識
mp.detect(x,y,pointer_id);
//ポインタを動かす
mp.move(x,y,pointer_id);
if(z<1500){
mp.down(x,y,pointer_id);
}else{
mp.up(x,y,pointer_id);
}
//
}
//一意のIDを作成
var pointer_id:int=int(parts.toString()+id.toString());
//
//ポインタ認識
mp.detect(x,y,pointer_id);
//ポインタを動かす
mp.move(x,y,pointer_id);
if(z<1500){
mp.down(x,y,pointer_id);
}else{
mp.up(x,y,pointer_id);
}
#include#include SOCKET s, s1; //ソケット // //connect int connect(){ int result; //戻り値 //接続を許可するクライアント端末の情報 struct sockaddr_in source; char buffer[1024]; //受信データのバッファ領域 char ans[] = "送信成功"; memset(&buffer, '\0', sizeof(buffer)); //送信元の端末情報を登録する memset(&source, 0, sizeof(source)); source.sin_family = AF_INET; //ポート番号はクライアントプログラムと共通 source.sin_port = htons(3000); source.sin_addr.s_addr = htonl(INADDR_ANY); //ソケット通信の開始準備 WSADATA data; result = WSAStartup(MAKEWORD(2, 0), &data); if (result < 0){ printf("%d\n", GetLastError()); printf("ソケット通信準備エラー\n"); } //ソケットの生成 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s < 0){ printf("%d\n", GetLastError()); printf("ソケット生成エラー\n"); } //ソケットのバインド result = bind(s, (struct sockaddr *)&source, sizeof(source)); if (result < 0){ printf("%d\n", GetLastError()); printf("バインドエラー\n"); } //接続の許可 result = listen(s, 1); if (result < 0){ printf("接続許可エラー\n"); } printf("接続開始\n"); s1 = s; //クライアントから通信があるまで待機 s1 = accept(s, NULL, NULL); if (s1 < 0){ printf("待機エラー\n"); } //クライアントから送信されたデータの受信 result = recv(s1, buffer, 10, 0); if (result < 0){ printf("受信エラー\n"); } printf("%sを受信しました\n", buffer); return 0; } // //send int send(char id[],char part[] ,char px[],char py[],char pz[]){ int result; //戻り値 char str[50]= ""; // sprintf_s(str,"%s,%s,%s,%s,%s",id,part,px,py,pz); // result = send(s1, str, strlen(str)+1, 0); return result; }
void DrawLimb(XnUserID player, XnSkeletonJoint eJoint1, XnSkeletonJoint eJoint2)
{
if (!g_UserGenerator.GetSkeletonCap().IsTracking(player))
{
printf("not tracked!\n");
return;
}
XnSkeletonJointPosition joint1, joint2;
g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(player, eJoint1, joint1);
g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(player, eJoint2, joint2);
if (joint1.fConfidence < 0.5 || joint2.fConfidence < 0.5)
{
return;
}
XnPoint3D pt[2];
pt[0] = joint1.position;
pt[1] = joint2.position;
g_DepthGenerator.ConvertRealWorldToProjective(2, pt, pt);
glVertex3i(pt[0].X, pt[0].Y, 0);
glVertex3i(pt[1].X, pt[1].Y, 0);
}
void SendPosition(XnUserID player,int id, XnSkeletonJoint part,char _part[2])
{
if (!g_UserGenerator.GetSkeletonCap().IsTracking(player))
{
printf("not tracked!\n");
return;
}
XnSkeletonJointPosition joint1;
g_UserGenerator.GetSkeletonCap().GetSkeletonJointPosition(player, part, joint1);
XnPoint3D pt[1];
pt[0] = joint1.position;
g_DepthGenerator.ConvertRealWorldToProjective(1, pt, pt);
//
char _id[2] = "";
sprintf( _id, "%d", id);
//
char _px[10] = "";
sprintf( _px, "%.3f", pt[0].X);
//
char _py[10] = "";
sprintf( _py, "%.3f", pt[0].Y);
//
char _pz[10] = "";
sprintf( _pz, "%.3f", pt[0].Z);
//
send(_id,_part,_px,_py,_pz);
}
定価:¥ 14,800 新品最安価格:¥ 17,300 (2店出品) 売上ランク:62位 レビュー平均: | |
by amazon通販最速検索 at 2010/12/21 | |