第一部分:安装运行:

1、下载opencv,并解压,将其目录下的sdk复制到eclipse的工作区间目录下,重命名为OpenCV-SDK(随意命名);

2、从eclipse中导入:file->import->general->exiting project into project->next->browse(选择路径)->select all->finish,此时project explorer中会出现opencv library-2.4.10,导入成功;

3、新建一个工程(要使用opencv)并选中,菜单栏project->properties->android->library中add->选中opencv library-2.4.10->OK;此时工程中会出现Android dependencies->opencv library-2.4.10.jar导入成功。接下来就可以调用相应的opencv中相应的功能进行java编程了。

4、接下来是使用ndk调用opencv(在1、2、3)的基础上;

5、头文件的生成(自动),使用命令行:

先进入到工程的src目录下:javah -classpath 加载类的路径 -d 输出路径 -jni 引导类的路径 Enter!成功生成.h文件:

注意两点:(1)-classpath 就是你生成.class文件的祖先目录,究竟是哪里呢?就是那个刚好要出现包文件的地方,比如我的ImageProc的class文件路径是F:\Android\OpenCV\GreyProcess\bin\classes\com\example\greyprocess\ImageProc.class包名是com.example,然后我classpath后面是F:\Android\OpenCV\GreyProcess\bin\classes\,(2)然后是-jni后面的,由于是在src目录下执行的javah命令这里直接写com.example.ImageProc就好了。我们使用javah不是为了单纯的生成.h头文件,不然就太大材小用了,我们是为了吧java文件中的函数声明转化成c和c++中可调用的函数形式,准确的说是可以通过ndk调用的形式,所以这里的文件名我们是可以随便改的,但是里面的函数不能动;

6、include头文件,编写c或者c++代码;

7、你会发现编写的东西总是报错,因为还要导入ndk中和opencv中的东西,还要配置android.mk和applation.mk,配置android.mk是有个横重要的地方,记得include一下opencv。这里主要说一下加入ndk的c库和opencv的库:

(1)先确定正确导入了ndk:window->preference->android->NDK->NDK location->browse:选择正确位置(如我的上面是D:\Java_NDK\Software\android-ndk-r10b)->apply->OK;

(2)设置构建环境变量:选中工程 project->properties->C/C++ Build->Enviroment->add:我的name是NDKROOT,然后value是你ndk所在的路径(我的是D:\Java_NDK\Software\android-ndk-r10b)->ok->apply

(3)导入需要的库:project->properties->C/C++ General->path and symbols->includes->add:重复选择,知道加入你所有要用的库->apply->ok;(这是我导入的几个:D:\Java_NDK\Software\android-ndk-r10b\platforms\android-4\arch-arm\usr\include;D:\Java_NDK\Software\android-ndk-r10b\platforms\android-8\arch-arm\usr\include;D:\Java_NDK\Software\android-ndk-r10b\sources\cxx-stl\gnu-libstdc++\4.6\include;F:\Android\OpenCV\OpenCV-SDK\native\jni\include这些因人而异)。

(4)设置完成,这时你会发现原来c或c++文件中的红叉叉没有了。

8、然后构建生成库,右击工程->build project;

9、运行工程run as android application。

第二部分:opencv的一些简单操作:

1、图片读取:

IplImage* src = NULL;
src = cvLoadImage(imagePath, CV_LOAD_IMAGE_GRAYSCALE);第一个参数是文件路径,第二个是图像的读取格式;

2、根据已有图片创建一个新的图片:

IplImage* des= NULL;
des= cvCreateImage(cvGetSize(src), src->depth,src->nChannels);三个参数:size,色深,通道数;

3、图片保存及释放:

cvSaveImage(outPath, des);
cvReleaseImage(&src);

4、图片显示:cvShowImage("图片:",des);

5、图片二值化:cvThreshold(src,des,a,255,CV_THRESH_BINARY);四个参数:原图像,生成后的图像存储,阈值,最大值;

6.、图片裁剪:设置裁剪区域,然后复制:

IplImage *src = cvLoadImage(imagePath,CV_LOAD_IMAGE_COLOR);
cvSetImageROI(src,cvRect(area.left.x, area.left.y, abs(area.right.x - area.left.x),abs(area.right.y - area.left.y)));
IplImage *des = cvCreateImage(cvGetSize(src), src->depth,src->nChannels);
cvCopyImage(src, des);
cvSaveImage(imagePath,des);
cvResetImageROI(src);
cvReleaseImage(&des);
cvReleaseImage(&src);

第三部分:NDK的简单使用,完成于Java层的数据信息交换:

1、jstring到char*的转化:

 JNIEXPORT void JNICALL Java_com_example_fun1
(JNIEnv *env, jobject obj, jstring in) {
const char* infile = env->GetStringUTFChars(in, ); int len_in = env->GetStringLength(in); char in_file[len_in+1];
strcpy(in_file, infile);
env->ReleaseStringUTFChars(in,infile); djvuapi_decompose(in_file, dir_file); }

2、char*到jstring的转化,和objectarray(实际是使用字符串数组)的使用:

 JNIEXPORT jobjectArray JNICALL Java_com_example_fun2(
JNIEnv *env, jobject obj, jstring in, jint sum) {
const char* infile = env->GetStringUTFChars(in, );
int len_in = env->GetStringLength(in);
char in_file[len_in];
strcpy(in_file, infile);
env->ReleaseStringUTFChars(in,infile);
char **strings = djvuapi_getpageinfo(in_file, &sum);
jclass class_type = env->GetObjectClass(in);
jobjectArray object_array = env->NewObjectArray(sum, class_type, );
for (int i = ; i < sum; i++) {
const char* t=strings[i];
jstring temp_string = env->NewStringUTF(t);
env->SetObjectArrayElement(object_array, i, temp_string);
env->DeleteLocalRef(temp_string);//考虑到内存,删除局部变量
}
return object_array;
}

3、一维数组的使用:

 JNIEXPORT void JNICALL Java_com_example_fun3
(JNIEnv *env, jobject obj, jintArray area){
int temp[];
env->GetIntArrayRegion(area,,,temp);//得到原数组的一份复制 temp[]=a.left.x;
temp[]=a.left.y;
temp[]=a.right.x;
temp[]=a.right.y;
env->SetIntArrayRegion(area,,,temp);//提交修改(即复制回去);
}

4、二维数组的使用:

 JNIEXPORT jobjectArray JNICALL Java_com_example_fun4
(JNIEnv *env, jobject obj){ list<Area> areas; jclass objClass=env->FindClass("[I");//根据签名获取class
int len=areas.size();
jobjectArray ans=env->NewObjectArray(len,objClass,NULL);
int t[],i=;
for(list<Area>::iterator ele=areas.begin();ele!=areas.end();ele++,i++)
{
t[]=ele->left.x;
t[]=ele->left.y;
t[]=ele->right.x;
t[]=ele->right.y;
jintArray a=env->NewIntArray();
env->SetIntArrayRegion(a,,,t);
env->SetObjectArrayElement(ans,i,a);
env->DeleteLocalRef(a);
}
return ans;
}

5、从Java中的native函数使用javah生成对应的头文件:

在命令行中进入到工程目录下,然后

javah -classpath bin/classes [包名].[类名]

然后就会在工程目录下生成.h文件,接下来只要把这个头文件复制到jni文件夹下相应的位置就好了。

6、生成签名javap:

很多时候我们需要根据函数或者属性的签名,为了可以在ndk层调用java层的函数和属性。这里就要用到javap这个东西:

在命令行进入到工程目录下,然后输入;

javah -classpath bin/classes [包名].[类名]

然后屏幕上就会显示对应的属性和方法的签名。

Opencv的使用,NDK的简单使用的更多相关文章

  1. !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结

    http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...

  2. opencv笔记3:trackbar简单使用

    time:2015年 10月 03日 星期六 13:54:17 CST # opencv笔记3:trackbar简单使用 当需要测试某变量的一系列取值取值会产生什么结果时,适合用trackbar.看起 ...

  3. Android Studio配置OpenCV(非NDK)

    参考:http://www.cnblogs.com/tail/p/4618476.html 工具: 1,Android Studio(AS)1.4 2,Opencv 2.4.11 步骤: 1,解压下载 ...

  4. NDK(19)简单示例:ndk调用java基本方法、数组;使用stl、访问设备

    一.ndk调用java类示例 1,调用基本方法 /* * Class: com_example_ndksample_MainActivity * Method: ndkFindJavaClass * ...

  5. Qt Opencv 在Linux下摄像头简单示例(转)

    下面写的文章也许网上也有类似的,但是大多数都没有给出思路及背景,让初学者每次都只能学到一点皮毛,不少知识需要大量搜索零碎地拼凑起来.题外话,虽然现在是碎片化信息时代,但正是这样信息整合能力也显得非常重 ...

  6. 使用AndroidStudio进行NDK开发简单配置

    1. 准备工作 在实际写代码之前,首先我们还是需要做一些准备工作: 下载NDK开发包:Android官方下载页面 配置系统环境变量 下载好NDK开发包之后,直接解压到任意目录,然后需要配置一下系统环境 ...

  7. Android学习笔记—Windows下NDK开发简单示例

    该示例假设Android开发环境已经搭建完成,NDK也配置成功: 1.在Eclipse上新建Android工程,名称为ndkdemo.修改res\layout\activity_main.xml &l ...

  8. OpenCV系列--摄像头控制的简单代码

    操作系统:windows xp 开发工具:VS2008 opencv版本:2.1.0 依赖库:OpenCV2.1\lib\highgui.lib #include "cv.h" # ...

  9. OpenCV中Denoising相关函数的简单介绍

    参考:http://wenhuix.github.io/research/denoise.html一.基本情况         (一)基本方法          Fast  Non-Local  Me ...

随机推荐

  1. 【2016北京集训测试赛(八)】 crash的数列 (思考题)

    Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...

  2. 人生苦短我用Python 第三周 函数周

    函数的定义: 1,def 函数名(参数1,参数2......): "注释:函数的作用和参数,增加可读性", 2,函数体 3,返回值 最简单的函数: def func(): prin ...

  3. html js文字左右滚动插件

    自己写过很多插件,但都是直接嵌入在了工程里,从来没有拿出来单独封装成一个文件过,这是第一次,希望是一个良好的开端. 一个文字过长而可以左右滚动的插件 <!DOCTYPE html> < ...

  4. CSS边框外的小三角形+阴影效果的实现。

    ...虽然是一个很小的问题,但其实还是挺实用的. 实现一个边框外的角. 用纯CSS来写. 一开始实现的效果是这个样子的. 但是这个效果没有办法给他附带阴影,所以换了一种写法.实现成了这个样子 想要实现 ...

  5. [2016-09-23]远程安装、更新windows服务bat脚本分享

    话不多说,有兴趣的自己可以仔细研究下涉及的命令:net use.sc.robocopy 脚本 set BuildConfig=[ENV] set BuildExeName=[your_exe_name ...

  6. .net分布式压力测试工具(Beetle.DT)

    肯定有人会问为什么会写这样一个开源工具?和现有的有什么差别?不过对于一个程序员来说写东西还真不需要理由的:),主要原因是工作有点闲(开玩笑),不过说实话一个程员怎可能会停止写代码呢(作为一个奔4的程序 ...

  7. CSS3学习笔记-1:CSS样式继承

    自己在写css时总会遇上css样式继承的问题,好在一般问题不大,但一直也不明白css样式继承的规则,最近发现了一篇文章讲的不错,因此转载过来: 所谓CSS的继承是指被包在内部的标签将拥有外部标签的样式 ...

  8. basepath的作用 (转)

    转自:http://blog.csdn.net/randomnet/article/details/8630754   在谈basePath之前,先来讨论一下相对路径与绝对路径的区别.    相对路径 ...

  9. Java笔记—— 格式化的输入和输出

    精确输出 可以用8个字符的宽度和小数点后了两个字符的精度打印x. double x = 10000.0 /3.0; System.out.printf("%8.2f\n",x);/ ...

  10. C# 导出数据到Excel模板中(转)

    今天做报表的时候遇到了多表头的问题,而且相应的报表的格式都一样.所以就采用了报表模板的方式来进行. 第一步:在开发的当前项目中引入:Microsoft.Office.Interop.Excel:Sys ...