OpenCv 介绍
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
opencv android版本下载地址:
android版本的下载地址
https://sourceforge.net/projects/opencvlibrary/files/opencv-android/
图1andoid项目中引入opencv
系统:Windows10;开发环境 android studio3.1.2 ; opencv 版本:opencv-3.4.1-android-sdk
第一步创建应用程序
图2第二步 创建Module,包名为org.opencv,使用这个包名和后面拷贝的java文件一致,否则需要修改java里面的引入的包;
图3第三步 拷贝前面下载的opencvsdk中的java文件到自己创建的module中,文件需要和sdk中的一致。
图4第四步构建项目会出现下面的错误,是因为aidl文件不能正常识别。没法生成对应的java文件。所以需要在创建的module中的src下面新建aidl文件夹,把原来的aidl文件移到对应的目录下参照图6
图5 图6第五步重新构建系统,发现还有错误,如图7;拷贝opencv-3.4.1-android-sdk\OpenCV-android-sdk\sdk\java\res\values\attrs.xml 文件到module中的 values文件夹,参照图8,重新构建项目,项目显示正常。
图7 图8第六步移动 opencv-3.4.1-android-sdk\OpenCV-android-sdk\sdk\native\libs\armeabi 文件到项目中的libs目录下,参照图9;
图9通过上面的步骤,opencv依赖的项目就创建成功了 。添加module到app项目中如图10
图10下面为验证opecv是否添加成功,利用opencv辨别图片的清晰度:
布局文件:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="切换图片"
android:id="@+id/changeImage"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="图片清晰度展示"
android:id="@+id/tips_tv"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="原图"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/show_iv"
/>
java代码:
package com.apkbj.www.opencvone;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import org.opencv.android.InstallCallbackInterface;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import java.io.IOException;
import java.io.InputStream;
public class MainActivityextends AppCompatActivity {
static {
System.loadLibrary("opencv_java3");
}
/**
* 文件路径
*/
private Stringid ="qinchu.png";
/**
* 图片清晰度展示
*/
private TextViewtips_tv;
/**
* 待计算的图片
*/
private ImageViewshow_iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("opencv项目搭建-- 图像模糊识别");
show_iv = (ImageView) findViewById(R.id.show_iv);
tips_tv = (TextView) findViewById(R.id.tips_tv);
findViewById(R.id.changeImage).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (id.equals("qinchu.png")) {
checkImage("muhu.png");
}else {
checkImage("qinchu.png");
}
}
});
}
/**
* 图片清晰度检验
*/
private void checkImage(String mipmap) {
id = mipmap;
InputStream is =null;
try {
is =this.getResources().getAssets().open(mipmap);
Bitmap bitmap = BitmapFactory.decodeStream(is);
show_iv.setImageBitmap(bitmap);
Boolean blur = isBlurByOpenCV(bitmap);
if (blur) {
tips_tv.setText("这张图片是模糊的");
}else {
tips_tv.setText("这张图片是清楚的");
}
}catch (IOException e) {
e.printStackTrace();
}
}
private boolean isBlurByOpenCV(Bitmap image) {
System.out.println("image.w=" + image.getWidth() +",image.h=" + image.getHeight());
int l = CvType.CV_8UC1;//8-bit grey scale image
Mat matImage =new Mat();
Utils.bitmapToMat(image, matImage);
Mat matImageGrey =new Mat();
Imgproc.cvtColor(matImage, matImageGrey, Imgproc.COLOR_BGR2GRAY);// 图像灰度化
Bitmap destImage;
destImage = Bitmap.createBitmap(image);
Mat dst2 =new Mat();
Utils.bitmapToMat(destImage, dst2);
Mat laplacianImage =new Mat();
dst2.convertTo(laplacianImage, l);
Imgproc.Laplacian(matImageGrey, laplacianImage, CvType.CV_8U);// 拉普拉斯变换
Mat laplacianImage8bit =new Mat();
laplacianImage.convertTo(laplacianImage8bit, l);
Bitmap bmp = Bitmap.createBitmap(laplacianImage8bit.cols(), laplacianImage8bit.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(laplacianImage8bit, bmp);
int[] pixels =new int[bmp.getHeight() * bmp.getWidth()];
bmp.getPixels(pixels,0, bmp.getWidth(),0,0, bmp.getWidth(), bmp.getHeight());// bmp为轮廓图
int maxLap = -16777216;// 16m
for (int pixel : pixels) {
if (pixel == -1) {
continue;
}
if (pixel > maxLap)
maxLap = pixel;
}
int userOffset =3881250;// 界线(严格性)降低一点
int soglia = -6118750 + userOffset;// -6118750为广泛使用的经验值
System.out.println("maxLap=" + maxLap);
if (maxLap <= soglia) {
System.out.println("这是一张模糊图片");
}
System.out.println("==============================================\n");
soglia +=6118750 + userOffset;
maxLap +=6118750 + userOffset;
return maxLap <= soglia;
}
}
待检验的两张图11、图12:
图11 图12最后一张gif图,程序运行结果:
需要整个项目的去下载 OpenCvOne.rar
网友评论