安装目录opencv for android 教程(环境搭建篇)

创建工程       

        步调如工程一,创建新工程GrayProcess2,将lena.jpg添加到资源文件,并按上面所示将opencv类库添加到工程中。

编写下层代码(java)

(1)Stings.xml

GrayProcess2 Hello world! Settings GrayProcess2 gray process image description(2)main.xml

 

 

(3)MainActivity.java

 

 

package com.iron.grayprocess2;import org.opencv.android.BaseLoaderCallback;import org.opencv.android.LoaderCallbackInterface;import org.opencv.android.OpenCVLoader;import android.os.Bundle;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Bitmap.Config;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends Activity implements OnClickListener{ private Button btnProc; private ImageView imageView; private Bitmap bmp; //OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操纵 private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS:{ System.loadLibrary("image_proc"); } break; default:{ super.onManagerConnected(status); } break; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnProc = (Button) findViewById(R.id.btn_gray_process); imageView = (ImageView) findViewById(R.id.image_view); //将lena图像加载程序中并进行表现 bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena); imageView.setImageBitmap(bmp); btnProc.setOnClickListener(this); } @Override public void onClick(View v) { int w = bmp.getWidth(); int h = bmp.getHeight(); int[] pixels = new int[w*h]; bmp.getPixels(pixels, 0, w, 0, 0, w, h); int[] resultInt = ImageProc.grayProc(pixels, w, h); Bitmap resultImg = Bitmap.createBitmap(w, h, Config.ARGB_8888); resultImg.setPixels(resultInt, 0, w, 0, 0, w, h); imageView.setImageBitmap(resultImg); } @Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存在于OpenCV安装包的apk目录中 OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback); }}  代码第28行:System.loadLibrary("image_proc")用来当OpenCV类库初始化实现后加载类库image_proc。此类库由我们来生成,用于实现图像灰度处理的操纵,此部分将在下面中说明。

 

  (4) ImageProc.java

 

package com.iron.grayprocess2;public class ImageProc {public static native int[] grayProc(int[] pixels, int w, int h);}

 

 ImageProc.java中只定义了方法grayProc,关键字native标明,此方法的实现由本地代码(C/C++)来实现。

 

编写JNI及C相关代码

        在项目中新建目录jni,在jni目录中分离添加文件Android.mk,Application.mk,ImageProc.h,ImageProc.cpp,这四个文件的内容分离如下所示。

        (1) Android.mk

 

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)include ../OpenCV-SDK/native/jni/OpenCV.mkLOCAL_SRC_FILES := ImageProc.cppLOCAL_MODULE := image_procinclude $(BUILD_SHARED_LIBRARY)

 

代码说明:

第一行:指明当前编译路径;

第二行:清空变量;

第三行:将OpenCV类库中的编译文件包含进来,如此一来在我们的工程中即可应用OpenCV类库;

第四行:指定须要编译的C++源文件;

第五行:指定编译生成的类库名称;

第六行:调用命令将源文件编译为静态库。

注:第三行指定的路径很关键,当opencv类库与工程路径相关位置产生改变时,此路径也要随之改变。

(2) Application.mk(配置文件)

 

APP_STL := gnustl_staticAPP_CPPFLAGS := -frtti -fexceptionsAPP_ABI := armeabi-v7aAPP_PLATFORM := android-8

 

(3)ImageProc.cpp

 

#include #include #include #include using namespace cv;using namespace std;JNIEXPORT jintArray JNICALL Java_com_iron_grayprocess2_ImageProc_grayProc(JNIEnv* env, jclass obj, jintArray buf, jint w, jint h){jint *cbuf;cbuf = env->GetIntArrayElements(buf, false);if(cbuf == NULL){return 0;}Mat imgData(h, w, CV_8UC4, (unsigned char*)cbuf);uchar* ptr = imgData.ptr(0);for(int i = 0; i < w*h; i ++){//计算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B//对于一个int四字节,其黑色值存储方法为:BGRAint grayScale = (int)(ptr[4*i+2]*0.299 + ptr[4*i+1]*0.587 + ptr[4*i+0]*0.114);ptr[4*i+1] = grayScale;ptr[4*i+2] = grayScale;ptr[4*i+0] = grayScale;}int size=w * h;jintArray result = env->NewIntArray(size);env->SetIntArrayRegion(result, 0, size, cbuf);env->ReleaseIntArrayElements(buf, cbuf, 0);return result;}

 

说明:

        ImageProc.h头文件可以通过jdk提供的工具javah来生成,详细生成方法在下面         JNI中的定义的函数遵循必定的命名规则:Java_包名_类名_方法名,详细参考JNI编程相关知识;         ImageProc.cpp中利用黑色值转换为灰度值的计算公式,将lena.jpg图像的每一个像素转换为灰度值,并返回给应用层。须要注意的是对于 ARGB_8888类型的图像而言,其每一个像素值在int型数据中的存储序列为BGRA。 还须要注 ImageProc.cpp 这个文件 第10行的函数名称Java_包名_类名_方法名 请修改成.h 文件生成的那个函数名  生成.h 文件

1.首先当年写完ImageProc.java 这个保存 当前 eclipse会自动帮你生成 java 的class文件

   你可以再工程目录--》 bin --》classes -》com -------。。。。。 的文件里找到

   比如我的 在E:workopOpenCV-2.4.5-android-sdksamplesTest2inclassescom est2 est2 这个路径下

如图

2.将classes文件拷贝到e盘根目录下

然后打开 cmd 

e:

cd classes

javah com.test2.test2.ImageProc

然后就会在classes文件里找到一个 xxx.的头文件 如图

你可以将这个头文件改成任意名字 比如我们上面的ImageProc.h 然后放入工程目录的jni中

编译运行方法有两种

1 配置eclipse自动运行

第一步:转换工程。点击“文件 -> 新建 -> 其他”(快捷键:Ctrl+N)。选择“C/C++”下的“Convert to a C/C++ Project(Adds C/C++ Nature)”。进 入“下一步”。

第二步:选中你刚才建的“HelloJni”工程,下面左边选“Makefile project”右侧选“Cygwin GCC”。肯定后提示的“透视图”不清楚是什么,点击“是”即可。

第三步:在“HelloJni”工程上右键,选择“属性”。配置“C/C++ Build”和“C/C++ General -> Paths and Symbols”。

C/C++ Build:点击“C/C++ Build”,在右侧的“Builder Settings”中去掉默许勾选的“Use default build command”复选框。设置Build command为“ ${NDKROOT}/ndk-build.cmd "

C/C++ General -> Paths and Symbols:在Includes下add新的GNU C依赖路径。此“HelloJni”工程须要“D:Javaandroid-ndk-r8platformsandroid-8arch-armusrinclude”即可,当前根据不同项目选择不同的依赖库。

这里只要是你cpp文件里面文件包含目录

你可以直接在NDK 和opencv jni那个目录下搜索头文件名 然后看看在那个路径有

配置好后运行就行了

 

2.手动应用Cygwin 生成os 然后运行

 由于程序中涉及到了JNI编程,因此须要用cygwin对其中的C/C++代码进行编译。打开cygwin,进入到工程的根目录中执行命令:$NDKROOT/ndk-build实现相关编译;当前在eclipse中刷新工程GrayProcess2,运行即可。编译及运行结果分离如下所示。

    

到这里两种方法都结束了!

有问题请留言

或者279291014@qq.com

 


比丘资源网 » 安装目录opencv for android 教程(环境搭建篇)

发表回复

提供最优质的资源集合

立即查看 了解详情