最近项目时间很紧,抓紧时间集中精力去研究android平台的opencv里的物体跟踪技术

其他几篇文章有时间再去完善吧

从网上找到了一些实例代码,我想采取的学习方法是研究实例代码和看教程相结合,教程是ndk编程方面的编程规则等、opencv人脸识别、物体跟踪这一块的教程

(1)人脸检测与跟踪库 asmlibrary   分析和研究

http://www.oschina.net/p/asmlibrary

http://yaohan.sinaapp.com/topic/3/asmlibrary#comments

我下载了6.0这个版本,往eclipse里导入的时候要注意一些问题,记得导入Opencv-Library,在C++的paths and symbols的include里把需要的库加进去,然后还可能遇到其他问

题,读者自行百度或者留言给我吧,一起讨论研究一下!

把这个项目导入eclipse之后,观察它的结构:

src文件夹下有两个java文件:  ASMFit.java, ASMLibraryActivity.java

jni文件夹下有 so文件夹,Android.mk,Application.mk,asmfitting.h,asmlibrary.h,DemoFit.cpp,vjfacedetect.h

在res文件夹下发现了一个文件夹 raw,第一次见,然后百度了一下,

assets和res下面raw文件的使用不同点

assets下面的文件不会被编译,通过路径可以去访问其中的内容。raw中文件会自动编译,我们可以在R.java文件中找到对应的ID

, , );

  • private MenuItem                mHelpItem;
  • private MenuItem                mDetectItem;
  • private MenuItem                mOrieItem;
  • private MenuItem                mCameraitem;
  • private CameraBridgeViewBase    mOpenCvCameraView;
  • private int                     mCameraIndex = CameraBridgeViewBase.CAMERA_ID_ANY;
  • public ASMLibraryActivity() {
  • Log.i(TAG, "Instantiated new " + this.getClass());
  • }
  • private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
  • private File getSourceFile(int id, String name, String folder){
  • File file = null;
  • try {
  • InputStream is = getResources().openRawResource(id);
  • File cascadeDir = getDir(folder, Context.MODE_PRIVATE);
  • file = new File(cascadeDir, name);
  • FileOutputStream os = new FileOutputStream(file);
  • byte[] buffer = new byte[];
  • int bytesRead;
  • while ((bytesRead = is.read(buffer)) != -) {
  • os.write(buffer, , bytesRead);
  • }
  • is.close();
  • os.close();
  • }catch (IOException e) {
  • e.printStackTrace();
  • Log.e(TAG, "Failed to load file " + name + ". Exception thrown: " + e);
  • }
  • return file;
  • }
  • ;
  • mFlag = false;
  • }
  • ;
  • mFlag = false;
  • }
  • ;
  • mFlag = false;
  • }
  • public void onCameraViewStopped() {
  • mGray.release();
  • mRgba.release();
  • }
  • public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
  • mRgba = inputFrame.rgba();
  • mGray = inputFrame.gray();
  • if(mPortrait ==true)
  • Core.transpose(mGray, mGray2);
  • else
  • mGray2 = mGray;
  • //WindowManager manager = getWindowManager();
  • //int width = manager.getDefaultDisplay().getWidth();
  • //int height = manager.getDefaultDisplay().getHeight();
  • //Log.d(TAG, "屏幕大小" + width + "x" + height);
  • if(mFrame ==  || mFlag == false)
  • {
  • Mat detShape = new Mat();
  • if(mFastDetect)
  • mFlag = mASMFit.fastDetectAll(mGray2, detShape);
  • else
  • mFlag = mASMFit.detectAll(mGray2, detShape);
  • if(mFlag)   mShape = detShape.row();
  • }
  • if(mFlag)
  • {
  • mFlag = mASMFit.videoFitting(mGray2, mShape, mFrame);
  • }
  • if(mFlag)
  • {
  • if(mPortrait == true)
  • {
  • int nPoints = mShape.row().cols()/;
  • for(int i = ; i < nPoints; i++)
  • {
  • double x = mShape.get(, *i)[];
  • double y = mShape.get(, *i+)[];
  • Point pt = new Point(y, x);
  • Core.circle(mRgba, pt, , mColor);
  • }
  • }
  • else
  • {
  • int nPoints = mShape.row().cols()/;
  • for(int i = ; i < nPoints; i++)
  • {
  • Point pt = new Point(mShape.get(, *i)[], mShape.get(, *i+)[]);
  • Core.circle(mRgba, pt, , mColor);
  • }
  • }
  • }
  • mFrame ++;
  • return mRgba;
  • }
  • }