Эмулирующая кнопка Нажмите с помощью Kinect / SimpleOpenni + глубина обработки -- processing поле с участием kinect поле с участием openni пол Связанный проблема

Emulating Button Press Using Kinect/SimpleOpenNI + Processing Depth


0
vote

проблема

русский

Я использую Kinect с простой Openni и обработкой, и я пытался использовать положение z рукой, чтобы эмулировать кнопку нажимать. Пока что когда я стараюсь использовать одну руку, она работает очень хорошо, однако, когда я пытаюсь заставить его работать со вторыми руками, только одна из рук. (Я знаю, что это может быть более эффективным, перемещая все, кроме заполнения выплат, если я удерживаю их, на всякий случай, если я хочу изменить размеры или что-то в этом роде.)

IRZ и ILZ - это начальные Z позиции рук, когда они сначала распознаются OnCreatehands, а RZ и LZ - текущие позиции z. На данный момент код работает нормально с одной стороны, но другая рука будет либо оставаться нажатой или неподвижной. Если я комментирую один из разделов, он тоже работает нормально.

 <код> if (rz - irz > 0) {  pushStyle();  fill(60);  ellipse(rx, ry, 10, 10);  popStyle();  rpressed = true; } else {  pushStyle();  noFill();  ellipse(rx, ry, 10, 10);  popStyle();  rpressed = false; }  if (lz - ilz > 0) {  pushStyle();  fill(60);  ellipse(lx, ly, 10, 10);  popStyle();  lpressed = true; } else {  pushStyle();  noFill();  ellipse(lx, ly, 10, 10);  popStyle();  lpressed = false; }   

Я попробовал выводить значения rz - IRZ и LZ - ILZ и номера варьируются от небольших отрицательных значений до небольших положительных значений (около -8 до 8) для LZ - ILZ. Но RZ - IRZ выводит номера от около 8-30 в зависимости от каждого времени, когда я бегу и никогда не бывает последовательным. Кроме того, когда я прокомментую код для LZ-ILZ, значения для RZ-IRZ выглядят просто хорошо, и он работает как предназначен. Есть ли причина отслеживания обоих Z позиций, выбрасывает одну руку? И есть ли способ получить его на работу?

Спасибо!

Английский оригинал

I am using Kinect with Simple OpenNI and Processing, and I was trying to use the Z position of a hand to emulate a button press. So far when I try it using one hand it works really well, however, when I try to get it to work with a second hand, only one of the hands work. (I know it can be more efficient by moving everything except the fill out of the if statements, but I kept those in there just in case I want to change the sizes or something.)

irz and ilz are the initial Z positions of the hands when they are first recognized by onCreateHands and rz and lz are the current Z positions. As of now, the code works fine with one hand, but the other hand will either stay pressed or unpressed. If i comment one of the sections out, it works fine as well.

if (rz - irz > 0) {  pushStyle();  fill(60);  ellipse(rx, ry, 10, 10);  popStyle();  rpressed = true; } else {  pushStyle();  noFill();  ellipse(rx, ry, 10, 10);  popStyle();  rpressed = false; }  if (lz - ilz > 0) {  pushStyle();  fill(60);  ellipse(lx, ly, 10, 10);  popStyle();  lpressed = true; } else {  pushStyle();  noFill();  ellipse(lx, ly, 10, 10);  popStyle();  lpressed = false; } 

I tried outputting the values of rz - irz and lz - ilz and the numbers range from small negative values to small positive values (around -8 to 8) for lz - ilz. But rz - irz outputs numbers from around 8-30 depending on each time I run it and is never consistent. Also, when I comment out the code for the lz-ilz, the values for rz-irz look just fine and it operates as intended. Is there a reason tracking both Z positions throws off one hand? And is there a way to get it to work?

Thanks!

</div
        

Список ответов

1
 
vote

У меня есть несколько идей:

  1. Используйте NITE "Нажмите" жест
  2. Используйте г положение руки, как вы сейчас, но и отслеживать различия в г движений
<Р> SimpleOpenNI, кажется, как одна руки лучше, чем два с Nite жестами как «Нажмите» (вы должны увидеть сообщение напечатанного после рука подобранна, а затем двигать руку вперед и назад). Пыльник быстрый пример. Обратите внимание, что я отслеживании +/- различий на Z и используя пороговое значение, чтобы только триггер, основанный на определенном расстоянии, это может быть, например, диапазон.
 <код> import SimpleOpenNI.*; SimpleOpenNI context; boolean      handsTrackFlag = false; PVector      handVec = new PVector(); PVector      handVec2D  = new PVector();//just for drawing String       lastGesture = ""; float        lastZ = 0; boolean      isPushing,wasPushing; float        yourClickThreshold = 20;//set this up as you see fit for your interaction  void setup(){   size(640,480);     context = new SimpleOpenNI(this);   context.enableDepth();   // enable hands + gesture generation   context.enableGesture();   context.enableHands();   // add focus gestures  / here i do have some problems on the mac, i only recognize raiseHand ? Maybe cpu performance ?   context.addGesture("Wave");   context.addGesture("Click");   context.addGesture("RaiseHand");  }  void draw() {   context.update();   image(context.depthImage(),0,0);   // draw the tracked hand   if(handsTrackFlag){     context.convertRealWorldToProjective(handVec,handVec2D);     float diff = (handVec.z-lastZ);     isPushing = diff < 0;     if(diff > yourClickThreshold){       if(!wasPushing && isPushing) fill(255,0,0);       if(wasPushing && !isPushing) fill(0,255,0);     }else fill(255);     lastZ = handVec.z;     wasPushing = isPushing;     ellipse(handVec2D.x,handVec2D.y,10,10);   }  }   // ----------------------------------------------------------------- // hand events  void onCreateHands(int handId,PVector pos,float time){   println("onCreateHands - handId: " + handId + ", pos: " + pos + ", time:" + time);    handsTrackFlag = true;   handVec = pos; }  void onUpdateHands(int handId,PVector pos,float time){   //println("onUpdateHandsCb - handId: " + handId + ", pos: " + pos + ", time:" + time);   handVec = pos; }  void onDestroyHands(int handId,float time){   println("onDestroyHandsCb - handId: " + handId + ", time:" + time);   handsTrackFlag = false;   context.addGesture(lastGesture); }  // ----------------------------------------------------------------- // gesture events  void onRecognizeGesture(String strGesture, PVector idPosition, PVector endPosition){   if(strGesture == "Click") println("onRecognizeGesture - strGesture: " + strGesture + ", idPosition: " + idPosition + ", endPosition:" + endPosition);    lastGesture = strGesture;   context.removeGesture(strGesture);    context.startTrackingHands(endPosition); }  void onProgressGesture(String strGesture, PVector position,float progress){   //println("onProgressGesture - strGesture: " + strGesture + ", position: " + position + ", progress:" + progress); }   
<Р> Альтернативой получить две руки, чтобы использовать <код> SKEL_PROFILE_HEAD_HANDS при выполнении скелетной отслеживания, но учтите, что точность руки ниже.
 

I've a couple of ideas:

  1. Use the NITE "Click" gesture
  2. Use the z position of the hand as you are now, but also keep track of differences in z movements

SimpleOpenNI seems to like one hand better than two with NITE gestures like "Click"(you should see a message printed after the hand is picked up and then move your hand forward and backward). Bellow is a quick example. Note that I'm keeping track of +/- differences on Z and using a threshold to only trigger based on a certain distance, this could be range for example.

import SimpleOpenNI.*; SimpleOpenNI context; boolean      handsTrackFlag = false; PVector      handVec = new PVector(); PVector      handVec2D  = new PVector();//just for drawing String       lastGesture = ""; float        lastZ = 0; boolean      isPushing,wasPushing; float        yourClickThreshold = 20;//set this up as you see fit for your interaction  void setup(){   size(640,480);     context = new SimpleOpenNI(this);   context.enableDepth();   // enable hands + gesture generation   context.enableGesture();   context.enableHands();   // add focus gestures  / here i do have some problems on the mac, i only recognize raiseHand ? Maybe cpu performance ?   context.addGesture("Wave");   context.addGesture("Click");   context.addGesture("RaiseHand");  }  void draw() {   context.update();   image(context.depthImage(),0,0);   // draw the tracked hand   if(handsTrackFlag){     context.convertRealWorldToProjective(handVec,handVec2D);     float diff = (handVec.z-lastZ);     isPushing = diff < 0;     if(diff > yourClickThreshold){       if(!wasPushing && isPushing) fill(255,0,0);       if(wasPushing && !isPushing) fill(0,255,0);     }else fill(255);     lastZ = handVec.z;     wasPushing = isPushing;     ellipse(handVec2D.x,handVec2D.y,10,10);   }  }   // ----------------------------------------------------------------- // hand events  void onCreateHands(int handId,PVector pos,float time){   println("onCreateHands - handId: " + handId + ", pos: " + pos + ", time:" + time);    handsTrackFlag = true;   handVec = pos; }  void onUpdateHands(int handId,PVector pos,float time){   //println("onUpdateHandsCb - handId: " + handId + ", pos: " + pos + ", time:" + time);   handVec = pos; }  void onDestroyHands(int handId,float time){   println("onDestroyHandsCb - handId: " + handId + ", time:" + time);   handsTrackFlag = false;   context.addGesture(lastGesture); }  // ----------------------------------------------------------------- // gesture events  void onRecognizeGesture(String strGesture, PVector idPosition, PVector endPosition){   if(strGesture == "Click") println("onRecognizeGesture - strGesture: " + strGesture + ", idPosition: " + idPosition + ", endPosition:" + endPosition);    lastGesture = strGesture;   context.removeGesture(strGesture);    context.startTrackingHands(endPosition); }  void onProgressGesture(String strGesture, PVector position,float progress){   //println("onProgressGesture - strGesture: " + strGesture + ", position: " + position + ", progress:" + progress); } 

An alternative to get two hands is to use the SKEL_PROFILE_HEAD_HANDS when doing skeletal tracking, but note that the hand precision is lower.

</div
 
 

Связанный проблема

2  Не может быть разрешено или не является полем (обработка)  ( Cannot be resolved or is not a field processing ) 
Я делаю Ray Tracer в обработке, и я получаю ошибку в строке <код> float xn = (this.r.direction.x) - (surface.center.x); "Поверхность. Центр не может быт...

2  Гава математический парсер, который может принимать сложные числа в качестве переменной?  ( Java math expression parser that can take complex numbers as a variable ) 
Я пишу программу в Обработка , которая преобразует сложные числа. Тем не менее, я хочу иметь способ предпринять входную строку и вычисление преобразования с ...

0  Choppy / заикание аудио с использованием Minim на RPI  ( Choppy stuttering audio using minim on rpi ) 
Я, кажется, имею большое количество неприятностей, пытаясь получить одновременное (четыре в этом случае) аудиофайлы для воспроизведения в обработке3 на малине...

0  Карточная игра войны с обработкой  ( The card game war with processing ) 
Хорошо, так что в моем классе работали над карточной игрой войны, но я должен использовать обработку, и мне нужно создать не повторяющийся генератор случайных...

1  Кособная перспектива - проекция нагрузки в обработке  ( Oblique perspective projection matrizes in processing ) 
Я хочу расширить обработку, чтобы иметь возможность рендерировать 3D вещи с косыми проектами (шкаф или кавалер). После взгляда на источник камеры (), методы п...

0  Production.js: остановить ускорение, используя снаряжение [закрыто]  ( Processing js stop acceleration using ease out ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос не соответствует Рекомендациям переполнения ...

0  Как добавить обработку Papplet в SWT  ( How to add a processing papplet in swt ) 
У меня есть проблема при попытке добавить <код> PApplet в SWT, он увеличивает пустое окно, когда он должен просто сделать <код> PApplet . Я <код> PApplet ра...

0  Как получить й позицию SKEL_HEAD Kinect?  ( How to get the x position of skel head kinect ) 
<Р> Я кодирование установки с Arduino, обработкой и Kinect. То, что я хочу получить й-как из SKEL_HEAD из примера кода обработки Kinect пользователя. <Р> Позж...

1  Обработка: эффективно создавать равномерную сетку  ( Processing efficiently create uniform grid ) 
Я пытаюсь создать сетку изображения (в том, как он будет плиткой с фоном). Вот что я использовал: <код> PImage bgtile; PGraphics bg; int tilesize = 50; voi...

0  Regex Regiving IDE (Java) из строки HTML  ( Regex processing ide java from html string ) 
Так что давайте дадим немного фона. Я пытаюсь схватить динамическое значение из веб-страницы (Web Trainling), что я смогу применить условные условные также, к...

0  Рабочие карты захвата для обработки на Mac  ( Working capture cards for processing on a mac ) 
Я недавно купил USB Capture Card для моего Mac (EZCAP: http: // www.amazon.com/easycap-version-capturer-camcorder-compatible/dp/b0044xiqiw ) И я не все, что ...

4  Различные цвета в обработке  ( Varying colors in processing ) 
Я работал над портированию некоторых из моего обрабатывающего кода, чтобы регулярные Java в NetBeans. Пока так хорошо, большинство все работает отлично, за ис...

2  Обработка Pubnub / Java для нуба  ( Pubnub processing java for a noob ) 
Я использую обработку (т.е. Java), чтобы публиковать через pubnub. Прочитав почти все простую запуск документации, я в потере. Мой код работает, но не публику...

7  3D SVG анимация в процессах перерабатывающих проблем, нагрузки SVG  ( 3d svg animation in processing flickering problems svg loading questions ) 
Я пытаюсь сделать промежуток времени географической визуализации Twitter, вдохновленную Джер Торп "только приземлился" . Я использую последнюю версию обработ...

0  При использовании обработки в Java, как вы выходите из апплета?  ( When using processing in java how do you exit out of an applet ) 
Я написал программу внутри <код> public void draw() для обработки <код> applet . Есть ли способ полностью закрыть апплет после завершения программы? такие ...