Android 开发 打包OpenCV Manager包

转载请注明:http://blog.csdn.net/forest_world
Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
include ../../sdk/native/jni/OpenCV.mk

LOCAL_SRC_FILES  := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS     += -llog -ldl

LOCAL_MODULE     := detection_based_tracker

include $(BUILD_SHARED_LIBRARY)

#OpenCV_CAMERA_MODULES:=on
#OpenCV_INSTALL_MODULES:=on
#OpenCV_LIB_TYPE:=SHARED
#include ${OpenCVROOT}/sdk/native/jni/OpenCV.mk

FdActivity.java

package org.opencv.samples.facedetect;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.objdetect.CascadeClassifier;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;

//import java.text.SimpleDateFormat;
import java.util.*;

//#define CV_FILLED -1
public class FdActivity extends Activity implements CvCameraViewListener2 {

    private static final String    TAG                 = "OCVSample::Activity";
    private static final Scalar    FACE_RECT_COLOR     = new Scalar(0, 255, 0, 255);

    private static final Scalar    green_COLOR     = new Scalar(0, 139, 69, 255); 

    private static final Scalar    blue_COLOR     = new Scalar(0, 0, 255, 255);
    private static final Scalar    yellow_COLOR     = new Scalar(238, 238, 0, 255);
    private static final Scalar    orange_COLOR     = new Scalar(0, 153, 255, 255);
    private static final Scalar    red_COLOR     = new Scalar(255, 0, 0, 255);

    public static final int        JAVA_DETECTOR       = 0;
    public static final int        NATIVE_DETECTOR     = 1;

    public int                    count   = 0;



    private MenuItem               mItemFace50;
    private MenuItem               mItemFace40;
    private MenuItem               mItemFace30;
    private MenuItem               mItemFace20;
    private MenuItem               mItemType;

    private Mat                    mRgba;
    private Mat                    mGray;
    private File                   mCascadeFile;
    private CascadeClassifier      mJavaDetector;
    private DetectionBasedTracker  mNativeDetector;

    private int                    mDetectorType       = JAVA_DETECTOR;
    private String[]               mDetectorName;

    private float                  mRelativeFaceSize   = 0.2f;
    private int                    mAbsoluteFaceSize   = 0;

    private CameraBridgeViewBase   mOpenCvCameraView;

    private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {

                    Log.i(TAG,"OpenCV library load!");
                    if (!OpenCVLoader.initDebug()) {
                        Log.i(TAG,"OpenCV load not successfully");
                    } else {
                        System.loadLibrary("detection_based_tracker");// load other libraries
                    }




                    /
                    Log.i(TAG, "OpenCV loaded successfully");

                    // Load native library after(!) OpenCV initialization
                    System.loadLibrary("detection_based_tracker");

                    try {
                        // load cascade file from application resources
                        InputStream is = getResources().openRawResource(R.raw.palm/*lbpcascade_frontalface*/);
                        File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
                        mCascadeFile = new File(cascadeDir, "cascade.dat"/*"lbpcascade_frontalface.xml"*/);
                        FileOutputStream os = new FileOutputStream(mCascadeFile);

                        byte[] buffer = new byte[4096];
                        int bytesRead;
                        while ((bytesRead = is.read(buffer)) != -1) {
                            os.write(buffer, 0, bytesRead);
                        }
                        is.close();
                        os.close();

                        mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());
                        if (mJavaDetector.empty()) {
                            Log.e(TAG, "Failed to load cascade classifier");
                            mJavaDetector = null;
                        } else
                            Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());

                        mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);

                        cascadeDir.delete();

                    } catch (IOException e) {
                        e.printStackTrace();
                        Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
                    }

                    mOpenCvCameraView.enableView();
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };


    static {
         Log.i(TAG,"OpenCV library load!");
         if (!OpenCVLoader.initDebug()) {
         Log.i(TAG,"OpenCV load not successfully");
         } else {
         System.loadLibrary("detection_based_tracker");// load other libraries
        }
        }



    public FdActivity() {
        mDetectorName = new String[2];
        mDetectorName[JAVA_DETECTOR] = "Java";
        mDetectorName[NATIVE_DETECTOR] = "Native (tracking)";

        Log.i(TAG, "Instantiated new " + this.getClass());
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "called onCreate");
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setContentView(R.layout.face_detect_surface_view);


        // add start
        try {
            // load cascade file from application resources
            InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
            File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
            mCascadeFile = new File(cascadeDir,"lbpcascade_frontalface.xml");
            FileOutputStream os = new FileOutputStream(mCascadeFile);

            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = is.read(buffer)) != -1)
            {
                os.write(buffer, 0, bytesRead);
            }
            is.close();
            os.close();

            mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());
            if (mJavaDetector.empty()) 
            {
                Log.e(TAG,"Failed to load cascade classifier");
                mJavaDetector = null;
            } 
            else
                Log.i(TAG,"Loaded cascade classifier from"+ mCascadeFile.getAbsolutePath());

            mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);

            cascadeDir.delete();

        } 
        catch (IOException e)
        {
            e.printStackTrace();
            Log.e(TAG,"Failed to load cascade. Exception thrown:"+ e);
        }
        //add end


        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.fd_activity_surface_view);
        mOpenCvCameraView.setCvCameraViewListener(this);
        mOpenCvCameraView.enableView();// add.
        //mOpenCvCameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_FRONT);//前置摄像头 CameraBridgeViewBase.CAMERA_ID_BACK为后置摄像头
        mOpenCvCameraView.setCvCameraViewListener(this);

    }

    @Override
    public void onPause()
    {
        super.onPause();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    @Override
    public void onResume()
    {
        super.onResume();
        //OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
    }

    public void onDestroy() {
        super.onDestroy();
        mOpenCvCameraView.disableView();
    }

    public void onCameraViewStarted(int width, int height) {
        mGray = new Mat();
        mRgba = new Mat();
    }

    public void onCameraViewStopped() {
        mGray.release();
        mRgba.release();
    }


    public int min(int a, int b) {
        if(a<=b)
            return a;
        else
            return b;
    }

    public int max(int a, int b) {
        if(a>=b)
            return a;
        else
            return b;
    }


    public float bbOverlap(Rect facesArray1 ,Rect facesArray2)
    {
      if (facesArray1.x > facesArray2.x+facesArray2.width) 
      { return 0; }
      if (facesArray1.y > facesArray2.y+facesArray2.height) 
      { return 0; }
      if (facesArray1.x+facesArray1.width < facesArray2.x) 
      { return 0; }
      if (facesArray1.y+facesArray1.height < facesArray2.y) 
      { return 0; }
      float colInt =  min(facesArray1.x+facesArray1.width,facesArray2.x+facesArray2.width) - 
              max(facesArray1.x, facesArray2.x);
      float rowInt =  min(facesArray1.y+facesArray1.height,facesArray2.y+facesArray2.height) - 
              max(facesArray1.y,facesArray2.y);
      float intersection = colInt * rowInt;
      float area1 = facesArray1.width*facesArray1.height;
      float area2 = facesArray1.width*facesArray2.height;
      return intersection / (area1 + area2 - intersection);
    } 

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

        mRgba = inputFrame.rgba();
        mGray = inputFrame.gray();

        if (mAbsoluteFaceSize == 0) {
            int height = mGray.rows();
            if (Math.round(height * mRelativeFaceSize) > 0) {
                mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);
            }
            mNativeDetector.setMinFaceSize(mAbsoluteFaceSize);
        }

        MatOfRect faces = new MatOfRect();

        //if (mDetectorType == JAVA_DETECTOR) {
            //if (mJavaDetector != null)
                mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE
                        new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());
        //}
        //else if (mDetectorType == NATIVE_DETECTOR) {
            //if (mNativeDetector != null)
                //mNativeDetector.detect(mGray, faces);
        //}
        //else {
        //    Log.e(TAG, "Detection method is not selected!");
        //}

        Rect[] facesArray = faces.toArray();

        for (int i = 0; i < facesArray.length-1; i++)
            for (int j = i+1; j < facesArray.length; j++)
            {
                if((facesArray[j].tl().x >=facesArray[i].tl().x)&&(facesArray[j].tl().y >=facesArray[i].tl().y)&&
                    (facesArray[j].br().x <=facesArray[i].br().x)&&(facesArray[j].br().x <=facesArray[i].br().x)    
                  )
                    {
                        facesArray[j].x = facesArray[j].y = facesArray[j].width = facesArray[j].height = 0;
                    }
                else if((facesArray[j].tl().x <=facesArray[i].tl().x)&&(facesArray[j].tl().y <=facesArray[i].tl().y)&&
                        (facesArray[j].br().x >=facesArray[i].br().x)&&(facesArray[j].br().x >=facesArray[i].br().x)    
                      )
                {
                    facesArray[i].x = facesArray[i].y = facesArray[i].width = facesArray[i].height = 0;
                }
                //if(bbOverlap(facesArray[i] ,facesArray[j]) > 0)
                //{
                //  facesArray[j].x = facesArray[j].y = facesArray[j].width = facesArray[j].height = 0;
                //  num++;
                //} 
            }

        int num = facesArray.length;
        for (int i = 0; i < facesArray.length-1; i++)   
        {
            if((facesArray[i].width == 0)&&(facesArray[i].height == 0))
            {
                for (int j = facesArray.length-1; j >= 0; j--)
                {
                    if((facesArray[j].width != 0)&&(facesArray[j].height != 0))
                    {
                        facesArray[i].x = facesArray[j].x; 
                        facesArray[i].y = facesArray[j].y; 
                        facesArray[i].width = facesArray[j].width; 
                        facesArray[i].height = facesArray[j].height;

                        facesArray[j].x = 0; 
                        facesArray[j].y = 0; 
                        facesArray[j].width = 0; 
                        facesArray[j].height = 0;
                        num--;
                    }
                }

            }   
        }

        Point point1 = new Point(60, 30);

        //Core.putText(mRgba,  text,  point1, fontFace, fontScale,  red_COLOR,4);
        for (int i = 0; i < /*facesArray.length*/num; i++)
        {
            Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), red_COLOR, 5);

            Point p1_e = new Point(facesArray[i].tl().x, facesArray[i].tl().y + 0.9*mRgba.height()/10.);
            Point p2_e = new Point(facesArray[i].br().x, facesArray[i].tl().y + 3.1*mRgba.height()/10.);
            //Core.rectangle(mRgba, p1_e, p2_e,  green_COLOR, 5);

        }

        if(num > 0)
            count +=10;
        else if(num == 0)
            count -=2;


        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        int hour = c.get(Calendar.HOUR);
        int minute = c.get(Calendar.MINUTE);
        int second = c.get(Calendar.SECOND);

        Point point2 = new Point(1*mRgba.width()/8., 2*mRgba.height()/8.);
        Point point3 = new Point(1*mRgba.width()/8., 3*mRgba.height()/8.);
        Point point4 = new Point(1*mRgba.width()/8., 4*mRgba.height()/8.);

        Point p1_warning = new Point(2*mRgba.width()/8., 6*mRgba.height()/8.);
        Point p2_warning = new Point(6*mRgba.width()/8., 7*mRgba.height()/8.);
        //Core.rectangle(mRgba, p1_warning, p2_warning,  green_COLOR, -1);
        return mRgba;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        Log.i(TAG, "called onCreateOptionsMenu");
        mItemFace50 = menu.add("Face size 50%");
        mItemFace40 = menu.add("Face size 40%");
        mItemFace30 = menu.add("Face size 30%");
        mItemFace20 = menu.add("Face size 20%");
        mItemType   = menu.add(mDetectorName[mDetectorType]);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);
        if (item == mItemFace50)
            setMinFaceSize(0.5f);
        else if (item == mItemFace40)
            setMinFaceSize(0.4f);
        else if (item == mItemFace30)
            setMinFaceSize(0.3f);
        else if (item == mItemFace20)
            setMinFaceSize(0.2f);
        else if (item == mItemType) {
            int tmpDetectorType = (mDetectorType + 1) % mDetectorName.length;
            item.setTitle(mDetectorName[tmpDetectorType]);
            setDetectorType(tmpDetectorType);
        }
        return true;
    }

    private void setMinFaceSize(float faceSize) {
        mRelativeFaceSize = faceSize;
        mAbsoluteFaceSize = 0;
    }

    private void setDetectorType(int type) {
        if (mDetectorType != type) {
            mDetectorType = type;

            if (type == NATIVE_DETECTOR) {
                Log.i(TAG, "Detection Based Tracker enabled");
                mNativeDetector.start();
            } else {
                Log.i(TAG, "Cascade detector enabled");
                mNativeDetector.stop();
            }
        }
    }
}

出现问题:Can’t load CascadeClassifier解决:
这里写图片描述

参考资料:
http://www.android100.org/html/201502/14/118706.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值