Распознавание жестов

Lihtelf
Offline
Зарегистрирован: 24.12.2012

Скоро будет готова самодельная сенсорная панель для ардуино.
Решил написать программу для распознавания жестов(пока что для processing'а).

Пока что получилась примитивная программа для распознания жеста сверху вниз(с нажатой левой кнопкой мыши), зона действия жеста внутри выделенного прямоугольника 

int door=0;
int button;
void setup()
{
 size(500,500); 
}

void draw()
{
 int brightness=51;
 background(brightness);
  fill(25);
 rect(175,50,150,400);
 if(mousePressed){
    fill(250);
  rect(mouseX-25,mouseY-25,50,50); 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(mouseX<300&&mouseX>200&&mouseY>100&&mouseY<400){
if(mouseX>200&&mouseX<300&&mouseY>75&&mouseY<125)
door=1;

if(door==1&&mouseX>200&&mouseX<300&&mouseY>375&&mouseY<425)
 button= 1;
 }

 
}
else{
door=0;
}
if(door==0)
button= 0;
if (mouseX>320||mouseX<170||mouseY>450||mouseY<50)
door=0;
 println(mouseX+" - - "+ mouseY);
  println("door ="+door+" - "+ "button ="+button);
}

Так вот, хотелось бы сделать распознавание не таких прямолинейных жестов , но ,например, по дуге.
Сушествует ли какая-нибудь ф-ция или просто способ определения того, принадлежит ли точка фигуре ( например любая кривая) или же придется делать по-другому??

Lihtelf
Offline
Зарегистрирован: 24.12.2012
int x0=300, y0=300;
float angle,anglerad;
void setup(){
  size(600,600);
}

void draw(){
 float dist=sqrt(sq(300-mouseX)+sq(300-mouseY));
 if(dist>225&&dist<250&&angle<30)
 background(30);
 else
  background(130);
  anglerad=acos((300-mouseY)/dist);
 angle=degrees(anglerad);
  fill(51);
ellipse(300,300,500,500);
  fill(91);
ellipse(300,300,450,450);
line(300,300,300-250*cos(PI/3),300-250*sin(PI/3));
line(300,300,300+250*cos(PI/3),300-250*sin(PI/3));
println(300-mouseY +" "+ dist +" "+ angle);
}

 

rammires
Offline
Зарегистрирован: 04.04.2013

Ну что, Вы решили вопрос с распознаванием жестов?

Вообще, мне кажется, Вам не нужно было заморациваться с принадлежностью точки фигуре. Гораздо проще разбивать сложное движение на простые и потом определять жест...

Вот простенькие код определяющий движения влево, вправо, вверх, вниз и по диагоналям...

int x;
int y;
int x1;
int y1;
int x2;
int y2;
void setup()
{
 size(500,500); 
}

void draw()
{
 int brightness=51;
 background(brightness);
  fill(25);
}

void mousePressed() {
    x1 = mouseX;
    y1 = mouseY;
}

void mouseReleased() {
 
    x2 = mouseX;
    y2 = mouseY;
    x = x1-x2;
    y = y1-y2;
    println("X= "+x+" - - "+ "Y= "+y);
    //прямо влево
    if((abs(y)<30) && (x>1)) {
      println("LEFT");
    }
    //прямо вправо
    if((abs(y)<30) && (x<1)) {
      println("RIGTH");
    }
    //прямо вверх
    if((abs(x)<30) && (y>1)) {
      println("UP");
    }
    //прямо вниз
    if((abs(x)<30) && (y<1)) {
      println("DOWN");
    }
    //по диагонали влево вверх
    if((abs(x)>30) && (abs(y)>30) && (x>1) && (y>1)) {
      println("UP-LEFT");
    }
    //по диагонали вправо вверх
     if((abs(x)>30) && (abs(y)>30) && (x<1) && (y>1)) {
      println("UP-RIGTH");
    }
    //по диагонали влево вниз
     if((abs(x)>30) && (abs(y)>30) && (x>1) && (y<1)) {
      println("DOWN-LEFT");
     }
    //по диагонали вправо вниз
     if((abs(x)>30) && (abs(y)>30) && (x<1) && (y<1)) {
      println("DOWN-RIGTH");
     }
  
}

В принципе можно попробовать похожим образом разбивать весь путь, он момента нажатия кнопки до отпускания , по таймеру на небольшие отрезки, упрощая их до прямых, а потом на основе полученных отрезков восстанавливать примерный путь.... но это так, чисто в виде бреда...

Вообще же распознавание жестов решаются с помощью нейронных сетей, в той же опере например, не знаю могут ли они быть реализованы на processing, но тем не менее http://www.codeproject.com/Articles/1591/Mouse-gestures-recognition

Кстати, вот есть реализация распознавания на js для jQuery http://habrahabr.ru/post/60448/, на основе того, что по ссыле выше, может поможет...

Lihtelf
Offline
Зарегистрирован: 24.12.2012

Ну вроде че-то получилось
http://symb.ucoz.com/

Изначально задан "жест" в виде буквы б ,если обвести(зажав левую кнопку мыши) букву Б праильно (из центра, а не сверху), то буква Б окрасится в зеленый цвет. Для удаления "жеста" надо нажать "h" (обязательно на английском). Затем можно нарисовать новый жест/символ зажав кнопку "d".

 

Lihtelf
Offline
Зарегистрирован: 24.12.2012
int i=0, x0, y0, x01, y01, coords[][]= {}, num=0, xmouse, ymouse, state, difValue=10, answ=30, DifAccess=200, x=0, y=1, SMB[];
byte door=1, n=0, hState=0/* предыдущее состояние*/, p; /*состояние кнопки*/
float CoordDif, dist, dif;
String lines[]; 
int[] colour={50,60,80};
PImage img; 
void setup() {<strong></strong>
 size(1024, 768);
 background(40);
 img = loadImage("123.png");
 noStroke(); 
 
 ///////////////////Загрузка жеста из файла
 p=1;
 lines = loadStrings("Data.txt");
 num=lines.length;
 expand(coords,600);
 for (int ioo = 0 ; ioo < num; ioo++) {
 String SMTH =lines[ioo];
 SMB = int(split(SMTH, ';'));
 coords=(int[][])append(coords, new int[] {SMB[0], SMB[1]}); 
 }
 num=coords.length;
}
void draw() {
 background(40);
 rectMode(CENTER);
 rect(1024/2, 768/2, 500, 800); 
 colorMode(HSB, 100);
 fill(answ, 100, 100);
 rect(1024/6, 768/4*3, 125, 125);
 colorMode(RGB, 100);
 ellipse(mouseX, mouseY, 20, 20);
 /* for (int inn=0;inn<num;inn++) {
 fill(90);
 ellipse(coords[inn][x], coords[inn][y], 20, 20);
 }
*/

 
 if (mousePressed||keyPressed) {
 p=1;
 if (key=='h') { //////////////////////////////////////Удаление жеста
 for (int numb=0;numb<num;numb++) {
 coords=(int[][])shorten(coords);
 hState=0;
 }

 num=0;
 i=0;
 }

 if (key=='d'&&keyPressed) { ///////////////////////Установка жеста
 p=1;
 dif=sqrt(sq(x01-mouseX)+sq(y01-mouseY));
 if (dif>=difValue) {
 // println(dif);
 x01=mouseX;
 y01=mouseY;
 coords=(int[][])append(coords, new int[] {
 mouseX, mouseY
 }
 );
 num++;
 // println("x - "+mouseX+" y - "+mouseY);
 for (int inn=0;inn<num;inn++) {
 ellipse(coords[inn][x], coords[inn][y], 20, 20);
 }
 }
 }
 
 if (!keyPressed&&num>0&&i<num) { /////////////////////////////проверка ввода
 CoordDif=sqrt(sq(coords[i][x]-coords[0][x]+ x0-mouseX)+sq(coords[i][y]-coords[0][y]+y0-mouseY));
 if (CoordDif<=DifAccess&&i<num) {
 i++; 
 answ=75;
 } 
 else
 answ=30 ;
 }
 if (CoordDif>240)
 i=0;
 if (num>0&&i==num&&sqrt(sq(coords[i-1][x]-coords[0][x]+ x0-mouseX)+sq(coords[i-1][y]-coords[0][y]+y0-mouseY))<=DifAccess/2) {
 answ=80;
 door=0;
 colour[0]=0;
 colour[1]=255;
 colour[2]=0;
 
 }
 }
 else
 p=0; 
 if (n==0 && p==1) {/////////////////////////////////////нажали
 
 x0=mouseX;
 y0=mouseY;
 } 
 if (n==1 && p==0) {//////////////////////отпустили
 colour[0]=50;
 colour[1]=60;
 colour[2]=80;
 answ=30;
 i=0; 
 if (door==0) {
 i=0;
 door=1;
 }
 xmouse=mouseX;
 ymouse=mouseY;
 dist=sqrt(sq(x0-xmouse)+sq(y0-ymouse));
 } 
 n=p;
 fill(30);
 
 imageMode(CENTER);
tint(colour[0],colour[1],colour[2]);
image(img, 1024/2, 768/2);
 

}

 

ourlive
Offline
Зарегистрирован: 26.05.2012

среди готовых библиотек видел распознаволку жестов