昨天CSDN博客抽风了。这是第7次编辑这个文件了,之前老是提交失败!
声明
1.电脑比较坑爹,前置摄像头坏掉了。
2.卡通化效果运行比较慢,老外的书上说是,人每触摸一下屏幕,才生成一张卡通化效果的图片
因此,为了简便期间,我就只对一副图像进行卡通化效果。
原理什么的见前面的文章,本文的目的,是熟悉ndk和jni
环境需求:
eclipse juno
ndk(r9)
android sdk 4.4 api 19
opencv 2.4.7 android版本
cygwin
准备工作:
1.将E:\OpenCV-2.4.7.1-android-sdk\sdk中的java项目导入工作空间,日后凡事java端调用opencv的函数都要用到这个类库
2.安装opencv manager.apk,目前在android上所有的opencv程序都必须依附于android manger。在DOS窗口口中执行:
adb install <OpenCV4Android SDKpath>/apk/OpenCV_2.4.7_Manager_2.14_armv7a-neon.apk
开始项目:
1.新建android application工程,取名Cartoonfiy,右击项目属性,勾选opencv类库

2.将林志玲MM的照片复制到drwabale随便哪个目录下,然后编写布局文件activity_main.xml:
效果比较丑,不管了:)
4.新建ImageProc类,编写本地化方法,作为调用c语言代码的入口:
5.在dos窗口中,使用javah工具,自动生成c语言的头文件,具体方法就是在DOS窗口中跑到Cartoonfiy项目的bin\classes目录下:
之后,在classes目录下将会有com_example_cartoonfiy_ImageProc.h文件,具体内容如下:
6.我们新建一个jni文件夹(名字就这个,不能随便改,否则ndk-build命令据说找不到的),把刚才的那个com_example_cartoonfiy_ImageProc.h文件拷贝过来。然后分别编写Android.mk:
和Application.mk:
7.回到MainActivity中,编写java端主要的代码:
好了,现在开始主要的C语言部分。由于是针对一副图像处理,我把上次的代码修改封装成一个函数,对应头文件和源文件内容分别是(这两个文件也放在jni目录下):
Cartoon.h:
Cartoon.cpp:
然后,编写我们的ImageProc.cpp:
最后用cygwin进行交叉编译:
打开cygwin,输入
cd /cygdrive/e/worksapce/Cartoonfiy
ndk-build
记得按F5,并clean一下工程,这是在libs目录下有个libimage_proc.so文件,
如果cygwin没有报错的话,然后运行我们的android applicatoin
运行效果:
注意:
1.老外书中说的android处理图片的color format,什么用照相机拍出来的是:YUV420s,用Bitmap读取的本地图片是:BGRA。当你的图像处理函数只能应付BGR时,你必须用cvtColor进行格式转换。老外又说什么转换格式会影响速度等等,这些先不管了。
2.关于c与java端数据传输,可以参考三个姓王的兄弟写的《android高级开发实战-UI、NDK、安全》。我这边在c 端直接把mat.data转换成int输出返回了。以后再学吧