GVKun编程网logo

使用OpenCV在哪里可以学习/找到从Kinect流式传输的手势识别示例?(基于opencv的手势识别)

4

对于使用OpenCV在哪里可以学习/找到从Kinect流式传输的手势识别示例?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解基于opencv的手势识别,并且为您提供关于android使用g

对于使用OpenCV在哪里可以学习/找到从Kinect流式传输的手势识别示例?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解基于opencv的手势识别,并且为您提供关于android使用gesturedetector手势识别示例分享、android创建手势识别示例代码、android开发之为activity增加左右手势识别示例、c – 如何使用OpenCV在COD中搜索玩家模型的宝贵知识。

本文目录一览:

使用OpenCV在哪里可以学习/找到从Kinect流式传输的手势识别示例?(基于opencv的手势识别)

使用OpenCV在哪里可以学习/找到从Kinect流式传输的手势识别示例?(基于opencv的手势识别)

我有Kinect和Windows和MacOSX的驱动程序。是否有使用OpenCV API从Kinect流式传输手势识别的示例?我正在尝试在Xbox
Kinect上实现类似于DaVinci的原型,但在Windows和MacOSX中。

答案1

小编典典

我认为它不会这么简单,主要是因为kinect的深度图像数据不是那么敏感。因此,在1m至1.5m的距离之后,所有手指将合并,因此您将无法获得清晰的轮廓来检测手指

android使用gesturedetector手势识别示例分享

android使用gesturedetector手势识别示例分享

复制代码 代码如下:

public class MyGestureLintener extends SimpleOnGestureListener {
private Context context;
public MyGestureLintener(Context context) {
    super();
    this.context = context;
}

// 单击,触摸屏按下时立刻触发
/*@Override
public boolean onDown(MotionEvent e) {
    // Todo Auto-generated method stub
    Toast.makeText(context,"Down " + e.getAction(),Toast.LENGTH_SHORT)
        .show();
    return true;
}*/
// 双击,手指在触摸屏上迅速点击第二下时触发
@Override
public boolean onDoubleTap(MotionEvent e) {
    // Todo Auto-generated method stub
    return super.onDoubleTap(e);
}

// 双击的按下跟抬起各触发一次
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
    // Todo Auto-generated method stub
    return super.onDoubleTapEvent(e);
}

 

// 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势
@Override
public boolean onFling(MotionEvent e1,MotionEvent e2,float veLocityX,
        float veLocityY) {
    // Todo Auto-generated method stub
    return super.onFling(e1,e2,veLocityX,veLocityY);
}

// 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发
@Override
public void onLongPress(MotionEvent e) {
    // Todo Auto-generated method stub
    Toast.makeText(context,"LONG " + e.getAction(),Toast.LENGTH_SHORT)
            .show();
}

// 滚动,触摸屏按下后移动
@Override
public boolean onScroll(MotionEvent e1,float distanceX,
        float distanceY) {
    Toast.makeText(context,"onScroll " + e2.getAction(),Toast.LENGTH_SHORT)
    .show();
    return true;
}

// 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会
@Override
public void onShowPress(MotionEvent e) {
    // Todo Auto-generated method stub
    Toast.makeText(context,"Show " + e.getAction(),Toast.LENGTH_SHORT)
            .show();

}

// 单击确认,即很快的按下并抬起,但并不连续点击第二下
/*@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    // Todo Auto-generated method stub
    Toast.makeText(context,"onSingleTapConfirmed " + e.getAction(),Toast.LENGTH_SHORT)
    .show();
    return true;
}*/

// 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势)
/*@Override
public boolean onSingleTapUp(MotionEvent e) {
    // Todo Auto-generated method stub

    Toast.makeText(context,"onSingleTapUp " + e.getAction(),Toast.LENGTH_SHORT)
    .show();
    return true;
}*/
public class MainActivity extends Activity {
private GestureDetector mGestureDetector;//手势对象
private MyGestureLintener myGestureLintener;//手势监听的接口对象

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myGestureLintener = new MyGestureLintener(this);

    //手势对象的构造方法
    mGestureDetector = new GestureDetector(this,
            myGestureLintener);
}

/**GestureDetector类的onTouchEvent方法用来辨别不同的手势*/
@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean b = false;
    int i = event.getAction();
    int j = MotionEvent.ACTION_MOVE;
    System.out.println(i+"<----------------->"+j);
    b = mGestureDetector.onTouchEvent(event);
    if (b) {
        Intent in = new Intent();
        in.setClass(this,testActivity.class);
        startActivity(in);
    }
    return b;

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main,menu);
    return true;
}
}

android创建手势识别示例代码

android创建手势识别示例代码

这篇的内容使用到的是android.gesture包,具体的例子参考的是Sample中GestureBuilder程序。

1、手势创建
手势创建主要用到GestureOverlayView和GestureLibrary。GestureOverlayView的父类为android.widget.FrameLayout,是手势绘图区。GestureLibrary类主要对手势进行保存、删除等操作的,存放手势的仓库。下面给出创建手势的例子,如下图,可以定义如图手势打开csdn.net

1.1、创建绘图区

复制代码 代码如下:

 GestureOverlayView overlay = (GestureOverlayView) findViewById(R.id.gestures_overlay);

overlay.setGesturestrokeType(GestureOverlayView.GESTURE_stroke_TYPE_MULTIPLE); 

overlay.setFadeOffset(2000);  //多笔画每两次的间隔时间
overlay.setGestureColor(Color.CYAN);//画笔颜色
overlay.setGesturestrokeWidth(6);//画笔粗细值

overlay.addOnGestureListener(new GesturesProcessor());

1.2、监听绘制

复制代码 代码如下:

 private class GesturesProcessor implements GestureOverlayView.OnGestureListener {
        public void onGestureStarted(GestureOverlayView overlay,MotionEvent event) {
            mDoneButton.setEnabled(false);
            mGesture = null;
        }

        public void onGesture(GestureOverlayView overlay,MotionEvent event) {
        }

        public void onGestureEnded(GestureOverlayView overlay,MotionEvent event) {
            mGesture = overlay.getGesture();
            if (mGesture.getLength() < LENGTH_THRESHOLD) {
                overlay.clear(false);
            }
            mDoneButton.setEnabled(true);
        }

        public void onGestureCancelled(GestureOverlayView overlay,MotionEvent event) {
        }
    }

1.3、保存手势

复制代码 代码如下:

 public void addGesture(View v) {
        if (mGesture != null) {
            final TextView input = (TextView) findViewById(R.id.gesture_name);
            final CharSequence name = input.getText();
            if (name.length() == 0) {
                input.setError(getString(R.string.error_missing_name));
                return;
            }

            /**
             * 获取手势库
             *   private final File mStoreFile = new File(Environment.getExternalStorageDirectory(),"gestures");
             *   GestureLibrary sstore = GestureLibraries.fromFile(mStoreFile);
             *
             */
            final GestureLibrary store = GestureBuilderActivity.getStore();
            store.addGesture(name.toString(),mGesture);
            store.save();

            setResult(RESULT_OK);

            final String path = new File(Environment.getExternalStorageDirectory(),
                    "gestures").getAbsolutePath();
            Toast.makeText(this,getString(R.string.save_success,path),Toast.LENGTH_LONG).show();
        } else {
            setResult(RESULT_CANCELED);
        }

        finish();

    }

2、手势识别

手势识别也是经过创建绘图区、监听绘制、比对结果三个过程,这里直接给出代码。

复制代码 代码如下:

public class GesturePerformedActivity extends Activity {

 private final File mStoreFile = new File(
   Environment.getExternalStorageDirectory(),"gestures");

 // 手势库
 GestureLibrary mGestureLib;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // Todo Auto-generated method stub
  super.onCreate(savedInstanceState);

  setContentView(R.layout.gesture_perform);
  // 手势画板
  GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures_overlay);

  gestures.setGesturestrokeType(GestureOverlayView.GESTURE_stroke_TYPE_MULTIPLE);

  gestures.setFadeOffset(2000); // 多笔画每两次的间隔时间
  gestures.setGestureColor(Color.CYAN);// 画笔颜色
  gestures.setGesturestrokeWidth(6);// 画笔粗细值

  // 手势识别的监听器
  gestures.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
   @Override
   public void onGesturePerformed(GestureOverlayView overlay,
     Gesture gesture) {
    // 从手势库中查询匹配的内容,匹配的结果可能包括多个相似的结果,匹配度高的结果放在最前面
    ArrayList<Prediction> predictions = mGestureLib
      .recognize(gesture);  
    if (predictions.size() > 0) {
     Prediction prediction = (Prediction) predictions.get(0);
     // 匹配的手势
     if (prediction.score > 1.0) { // 越匹配score的值越大,最大为10
      Toast.makeText(GesturePerformedActivity.this,
        prediction.name,Toast.LENGTH_SHORT).show();
     }
    }
   }
  });

  if (mGestureLib == null) {
   mGestureLib = GestureLibraries.fromFile(mStoreFile);
   mGestureLib.load();
  }
 }

}



android开发之为activity增加左右手势识别示例

android开发之为activity增加左右手势识别示例

android开发中为activity增加左右手势识别,如右滑关闭当前页面。

复制代码 代码如下:

/*
 *  for左右手势
 *  1.复制下面的内容到目标Activity
 *  2.目标Activity的onCreate()调用initGesture()
 *  3.目标Activity需implements OnTouchListener,OnGestureListener
 */
   private GestureDetector mGestureDetector;
   private int verticalMindistance = 180;
   private int minVeLocity         = 0;

   private void initGesture() {
    mGestureDetector = new GestureDetector((OnGestureListener) this);
   }

  public boolean onFling(MotionEvent e1,MotionEvent e2,float veLocityX,float veLocityY) {

       if (e1.getX() - e2.getX() > verticalMindistance && Math.abs(veLocityX) > minVeLocity) {

           // 切换Activity
           // Intent intent = new Intent(ViewSnsActivity.this,UpdateStatusActivity.class);
           // startActivity(intent);
           //Toast.makeText(this,"向左手势",Toast.LENGTH_SHORT).show();
       } else if (e2.getX() - e1.getX() > verticalMindistance && Math.abs(veLocityX) > minVeLocity) {

           // 切换Activity
           // Intent intent = new Intent(ViewSnsActivity.this,UpdateStatusActivity.class);
           // startActivity(intent);
        //Toast.makeText(this,"向右手势",Toast.LENGTH_SHORT).show();
           finish();
           overridePendingTransition(R.anim.push_right_in,R.anim.push_right_out);
       }

       return false;
   }

@Override
public void onLongPress(MotionEvent arg0) {
 // Todo Auto-generated method stub

}

@Override
public boolean onScroll(MotionEvent arg0,MotionEvent arg1,float arg2,
  float arg3) {
 // Todo Auto-generated method stub
 return false;
}

@Override
public void onShowPress(MotionEvent arg0) {
 // Todo Auto-generated method stub

}

@Override
public boolean onSingleTapUp(MotionEvent arg0) {
 // Todo Auto-generated method stub
 return false;
}

@Override
public boolean onTouch(View v,MotionEvent event) {
 // Todo Auto-generated method stub
 return mGestureDetector.onTouchEvent(event);
}

@Override
public boolean onDown(MotionEvent arg0) {
 // Todo Auto-generated method stub
 return false;
}

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) {
 mGestureDetector.onTouchEvent(ev);
 return super.dispatchTouchEvent(ev);
  } 

push_right_in.xml

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="500" />
    <alpha android:fromAlpha="0.1" android:toAlpha="1.0"
        android:duration="500"/>
</set>

push_right_out.xml

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="500" />
    <alpha android:fromAlpha="1.0" android:toAlpha="0.1"
        android:duration="500"/>
</set>

c – 如何使用OpenCV在COD中搜索玩家模型

c – 如何使用OpenCV在COD中搜索玩家模型

我正在尝试创建一个程序,可以在使命召唤的游戏视频中找到人物.我已经从这个视频中编制了一个约2200个单独图像的列表,其中包含人物或不包含人物.然后我尝试训练神经网络来分辨两组图像之间的差异.

然后,我将每个视频帧分成几百个网格矩形,然后用我的ANN检查每个视频帧.矩形重叠以尝试捕获网格之间的数字,但这似乎不能很好地工作.所以我有几个问题:

>神经网络是否可行?我已经读过它们与其他机器学习算法相比非常快,最终我计划将它与实时视频一起使用,速度非常重要.
>搜索图像框架中的数字以在ANN上进行测试的最佳方法是什么?我觉得我这样做的方式并不是很好.它绝对不是非常快或准确.每帧图像960 x 540大约需要一秒钟,并且精度很差.
>我遇到的另一个问题是构建要用作ANN输入的特征向量的最佳方法.目前,我只是将所有输入图像缩小到25 x 50像素,并创建一个包含每个像素强度的特征向量.这是一个非常大的矢量(1250浮点数).有哪些更好的方法来构建特征向量?

有关我在此处所做的更详细说明:CodAI: Computer Vision

编辑:我想要更多细节.计算要素的最佳方法是什么.我需要能够识别出许多不同位置的人物形象.我是否需要创建单独的分类器来识别直立,蹲伏和俯卧之间的区别?

解决方法

>使用原始强度作为特征向量不起作用1.照明等引起的变化太大
>作为第一步看待的一个很好的功能是HOG. opencv 2.2有一个快速的GPU(cuda)版本的探测器.
>神经网络可能不是最好的方法.通常你会使用SVM或boost作为分类器2.并不是神经网络不够强大,而是很难让训练/参数正确.你经常陷入局部最小等.
>对于俯卧/蹲伏/站立的数字,您肯定需要不同的分类器并在混合模型中使用它们.
>你问了一个“最好的方法” – 人类检测到目前为止还没有解决问题,所以没有人知道最好的方法.众所周知,上面提到的事情非常好.
>如果你想要一个好的结果,你肯定想利用你的目标是特定的 – 所以,利用你试图检测人类的职责.您需要检查的位置范围不是整个图像,数字将靠近地面.这使您可以加快搜索速度并减少错误检测.如果可以的话,减少渲染的细节 – 更少的细节意味着更少的变化,这意味着更容易学习的问题.

脚注:1对于nitpickers:没有高度复杂的分类器.2您还可以使用级联的增强分类器来提高速度,而不会过多地提高检测率.

关于使用OpenCV在哪里可以学习/找到从Kinect流式传输的手势识别示例?基于opencv的手势识别的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android使用gesturedetector手势识别示例分享、android创建手势识别示例代码、android开发之为activity增加左右手势识别示例、c – 如何使用OpenCV在COD中搜索玩家模型等相关内容,可以在本站寻找。

本文标签: