最近在做一个文字识别的工具,主要是想从图片中提取出对我有用的信息。
文字识别用的是Tesseract的文字识别库,写了一个demo,发现识别的速度很慢,于是想是不是要对原图做些处理呢?!
于是乎,找到了这个博文:Android中的文字识别(论文精简版),里面提到需要对原图片做基本的处理:
对于图片的处理,使用的OpenCV库。所以在此记录一下在Android中怎么使用OpenCV库。
OpenCV库简介
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
Android集成OpenCV库
我这边是在Android Studio上集成的,而且Android Studio已经集成好NDK了。
(1)下载OpenCV库的SDK
地址:http://opencv.org/releases.html。
解压之后,应该是这样的:
进入sdk文件夹,如图:
(2)项目添加依赖module
选择sdk/java文件夹。
并把app模块依赖openCVLibrary341模块:
(3)修改配置
比如我们app模块的build.gradle如下:
需要把红色框里面的内容复制到openCVLibrary341模块的build.gradle中,
(4)添加库文件
把OpenCV库文件添加到项目中:
复制到项目中的lib文件夹中:
(5)最后调整
还要在app模块的build.gradle添加以下配置:
方便拷贝:
dependencies里面:
compile fileTree(dir: "$buildDir/native-libs",include: 'native-libs.jar')
task:
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个步骤就可以配好了!
OpenCV库使用实例
集成完OpenCV库之后,我们来尝试使用一下。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Button btn;
private Mat imageMat;
private ImageView imageView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.img);
imageView.setImageResource(R.drawable.hahah);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 图像灰度化
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.hahah);
Mat mat_src = new Mat(bitmap.getWidth(), bitmap.getHeight(), CvType.CV_8UC4);
Utils.bitmapToMat(bitmap, mat_src);
Mat mat_gray = new Mat(bitmap.getWidth(), bitmap.getHeight(), CvType.CV_8UC1);
Imgproc.cvtColor(mat_src, mat_gray, Imgproc.COLOR_BGRA2GRAY, 1);
final Bitmap bmp_dst = Bitmap.createBitmap(mat_gray.cols(), mat_gray.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mat_gray, bmp_dst);
imageView.setImageBitmap(bmp_dst);
}
});
}
@Override
protected void onResume() {
super.onResume();
// 加载并初始化OpenCV类库
if (!OpenCVLoader.initDebug()) {
Log.d("OpenCV", "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback);
} else {
Log.d("OpenCV", "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
/**
* 加载回调
*/
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
Log.i(TAG, "OpenCV loaded successfully");
imageMat=new Mat();
break;
default:
super.onManagerConnected(status);
break;
}
}
};
}
使用起来其实还挺简单的!!
原图:
灰度化图:
终于体验到这个库的强大了!!聊聊几行代码,便可实现灰度化,太强了!!