最近要进行图像的处理,然后还是在Android上的应用,感觉资源不够用了,
· 两种使用方式,你可以将你想要的所有的函数,全部用 JNI/NDK 的方式,这个过段时间再写,单纯的搭建 JNI/NDK的环境没什么实际的意思,第二种方式就是 将Opencv的环境搭到 Android中,其实都是差不多的,JNI最后生成 .so 文件。方式不一样 本质上面差不多。先从简单的说起。
ok, 第一 将Opencv的环境部署到 Android 上面去。
第二 测试环境是否成功
第三 获得图片 1、直接Imageview获取图片 2、相机获取图片 JavaCameraView 或是 Intent 系统的照相机
一、环境的搭建
1、 首先你得安装 Androidtudio,其次先去 opencv的网站,下载 Android版的Opencv 网址:https://opencv.org/platforms/android/
2、新建一个AS的工程,include C++ support 随你选不选(方便以后JNI的使用),一路确定到底。然后导入依赖,
File ---> new ---> import Module 找到 下载好的 opencvForAndroid 的目录(区别Visual Studio 这边不需要配置环境变量)导入类似于路径 D:\OpenCVandroidsdk\sdk\java 的路径 然后在dependency中添加依赖。更改 opencvXXX 中的编译版本跟自己的Android版本一致 大概如下所示:
3、拷贝相关的 .so 文件 复制到 app 下面的 libs目录
其实你根据你设备只要复制一个 armeabi 差不多大部分的都是这个了。要是不放心全部扔进来(每次编译的时候时间较长)
4、修改gradle的脚本,直接复制 粘贴就行了 在 build.gradle(app) 中添加
app build.gradle 里面 dependency 里面添加 { implementation project(':openCVLibrary341') 这个会自动生成 } implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar') 全部打包成。.jar
然后在 dependency 目录下添加:
task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs'){
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
tasks.withType(JavaCompile){
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
5、测试是否成功 来副灰度图像的变化 Android 下的opencv和Visual Studio 中有点小区别,基本上也差不多
在 drawable 中放置一张图片,,layout中放置一个 ImageView
//将彩色图像变成灰色图像
private void convert2Grey() {
//新建对象
Mat src = new Mat();
Mat temp = new Mat();
Mat dst = new Mat();
Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.wen);
Utils.bitmapToMat(image, src);
Imgproc.cvtColor(src, temp, Imgproc.COLOR_RGBA2BGR);
Log.i("dachenopencv", "image type:+" + (temp.type() == CvType.CV_8UC3));
Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);
Utils.matToBitmap(dst, image);
DC_ImageView_ShowImg.setImageBitmap(image);
//release memory
src.release();
temp.release();
dst.release();
}
二、如何处理
Drawable中的图片可以处理了,但是你要是处理大量的图片,肯定不可能放 drawable 中,每次都会进行编译,放Assets中稍微好一点,不会被编译了,但是图片再大一点就不靠谱了。养成好的编程习惯,大量图片就扔SD卡中。注意外置和内置的区别。读取图片的方法,见另外一个博客,(Android文件路径的操作)
进行摄像头的读写,这也是必须的。
1、调用 Android 自带的摄像头
权限:<uses-permission android:name="android.permission.CAMERA"/>
然后开始拍照: //开始拍照
private void StartCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //拍照
startActivityForResult(intent);
}
这样子就可以打开自带的摄像头了,但是呢,感觉单纯的就是一个调试,所以建议调用 startActivityForResult(intent, FLAG_YOU_Decide); 将拍的图片的文件路径保存出来,下次操作时,读取路径就行了,别傻乎乎的在Activity Fragment中传递图片,数据量肯定很大,
2、使用 Opencv 的摄像头
布局文件中添加:
<org.opencv.android.JavaCameraView
android:id="@+id/DC_OpencvCameraView"
android:layout_width="400dp"
android:layout_height="400dp"
android:visibility="gone" />
//初始化摄像头
private void CameraInitCamera() {
//设置为可见
DC_OpencvCameraView.setVisibility(SurfaceView.VISIBLE);
// 0 前置 1 后置
DC_OpencvCameraView.setCameraIndex(0); // 0 是前置 1 是后置
DC_OpencvCameraView.setCvCameraViewListener(this); //set up frame listener
DC_OpencvCameraView.enableFpsMeter();
DC_OpencvCameraView.enableView();
DC_OpencvCameraView.enableFpsMeter();
//用完就直接释放
if (DC_OpencvCameraView != null) {
DC_OpencvCameraView.disableView();
}
DC_OpencvCameraView.enableView();
}
implements CameraBridgeViewBase.CvCameraViewListener2 监听
//Opencv Camera 的操作
@Override
public void onCameraViewStarted(int width, int height) {
}
@Override
public void onCameraViewStopped() {
}
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
Mat frame = inputFrame.rgba();
return frame;
}
图片就出来了,你想怎么玩就怎么玩去吧
纯属个人的学习总结,亲测可以用,不足之处,请大家不吝赐教谢谢大家。