在本篇文章中,我们主要介绍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导入到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供给的图片转化为灰度的方法,暂时还没找到。

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

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

更多相关文章

  1. 招聘Android手机应用开发工程师
  2. Android命令行启动程序的方法
  3. android build path contains duplicate entry:'src' for projec
  4. Android(安卓)如何永久性开启adb 的root权限
  5. android wifi热点默认网关
  6. Android(安卓)5.0 开机横屏修改方法
  7. 更改Android应用程序的图标
  8. Idea8启蒙开发Google手机Android四步走
  9. Android导入源文件没有自生成R.java和关于"@color"

随机推荐

  1. Android下的Junit单元测试
  2. Android(安卓)版本更新的实现
  3. Android菜鸟笔记-Fragment日常使用记录
  4. activity配置信息详解
  5. Android(安卓)Camera2 Hal3(一)初始化
  6. Android(安卓)Studio多渠道打包和代码混
  7. Android(安卓)RecyclerView嵌套RecyclerV
  8. Cursor, MergeCursor, MatrixCursor灵活
  9. android之recyclerview的基本使用
  10. android sqlite database is locked (cod