现在的位置: 首页 > 综合 > 正文

OpenCV4Android–使用java api做人脸识别

2014年01月03日 ⁄ 综合 ⁄ 共 2755字 ⁄ 字号 评论关闭

在android上有两种方法使用opencv,第一使用opencv提供好的库文件,然后调用opencv的java api来做图像处理。第二种是使用opencv的C++  api,但是需要ndk来创建动态库,然后android工程间接调用动态库中的函数。

本文主要使用第一种方法,(关于环境的配置,网上很多,个人使用的是http://blog.csdn.net/nuptboyzhb/article/details/8696940,其实如果单纯的使用第一种方法,cdt和ndk都不用安装,只需要解压opencv的ok了


第一步,将opencv解压,拷贝sdk/java到eclipse工程文件夹下



第二步,导入工程,将java导入到eclipse工程中,修改配置(选择android api勾选is library)


api选择必须是11也就是3.0 以上,否则会报错。

第三步,建立自己的工程

修改配置,library add刚才添加的java工程即可。(也可修改project.properties文件在最后加上android.library.reference.1=../java,确保java工程和你新建的工程目录是同级的。若没有project.properties,那修改default.properties)


添加成功会出现以下图片,(java_src)


第四步,编写代码

 首先在onResume中加载初始化opencv库

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

然后实现baseloadercallback借口,在其中加载是别的分类器,代码来自于opencv人脸是别的范例。

    private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {
                    Log.i(TAG, "OpenCV loaded successfully");
               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());

                     
                        cascadeDir.delete();

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

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

最后在按钮的事件中添加如下

    	 mRgba=new Mat();
         mGray=new Mat();
         Bitmap imgtemp=((BitmapDrawable) getResources().getDrawable(R.drawable.lena)).getBitmap();  
                Utils.bitmapToMat(imgtemp, mRgba);
                
            	Bitmap img=ConvertGrayImg(R.drawable.lena); 
            	Utils.bitmapToMat(img, mGray);
            	//mGray//灰度化
            	if (mAbsoluteFaceSize == 0) {
                    int height = mGray.rows();
                    if (Math.round(height * mRelativeFaceSize) > 0) {
                        mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);
                    }
                   
                }
            	
            	MatOfRect faces = new MatOfRect();
             
            	if (mJavaDetector != null)
            	{
            		mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE
                           new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());
            	}
                Rect[] facesArray = faces.toArray();
                for (int i = 0; i < facesArray.length; i++)
                    Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3);
             
                Utils.matToBitmap(mRgba, imgtemp,true);
                imgView.setImageBitmap(imgtemp);  

其中用到了一个灰度化的函数

ConvertGrayImg,可以参考http://blog.csdn.net/hellogv/article/details/6094127

暂时就这么多了,opencv java api提供的图片转化为灰度的方法,暂时还没找到。

抱歉!评论已关闭.