zoukankan      html  css  js  c++  java
  • javaapiOpenCV4Android使用java api做人脸识别

    在本篇文章中,我们主要介绍javaapi的内容,自我感觉有个不错的建议和大家分享下

        在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和api

        java和api

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

        java和api

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

        第三步,建立自己的工程

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

        java和api

        添加胜利会出现以下图片,(java_src)

        java和api

        第四步,编写代码

         首先在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供给的图片转化为灰度的方法,暂时还没找到。

        java和api

    文章结束给大家分享下程序员的一些笑话语录: 古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟

    --------------------------------- 原创文章 By
    java和api
    ---------------------------------

  • 相关阅读:
    三层架构及生活实例
    初识ADO.NET
    remoting与socket、web service的比较及实例
    ERP与MES
    25人赛跑问题-得出前三名
    WPF导学目录
    心目中的职业初规划
    应用服务器
    2015广深骑行记
    ASP.NET的几个试题(《C#与.NET程序员面试宝典》)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3109004.html
Copyright © 2011-2022 走看看