前言:网上已经有很多人将Opencv集成进Android项目中了。因此我只给大家看Gradle文件和项目目录。

1、gradle

三个gradle script

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
google()
jcenter() }
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
} allprojects {
repositories {
google()
jcenter() }
} task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'com.android.application'

android {
compileSdkVersion
defaultConfig {
applicationId "cn.baldorange.myapplication"
minSdkVersion
targetSdkVersion
versionCode
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
} dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
implementation project(':openCVLibrary347')
implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
}
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)
}
apply plugin: 'com.android.library'

android {
compileSdkVersion
buildToolsVersion "28.0.3" defaultConfig {
minSdkVersion
targetSdkVersion
} buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}

二、JNILIB

三、MainActivity

package cn.baldorange.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import cn.baldorange.myapplication.activities.CameraActivity; import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc; public class MainActivity extends AppCompatActivity { private ImageView imageView;
private Button button;
private Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//初始化
if (OpenCVLoader.initDebug()) {
Toast.makeText(this, "OpenCVLoader初始化成功", Toast.LENGTH_SHORT).show();
} //测试灰度
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
convert2Grey();
}
}); button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this, CameraActivity.class);
startActivity(i);
}
});
} private void convert2Grey() {
Mat src = new Mat();//Mat是OpenCV的一种图像格式
Mat temp = new Mat();
Mat dst = new Mat();
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.powershell);
Utils.bitmapToMat(bitmap, src);
Imgproc.cvtColor(src, temp, Imgproc.COLOR_RGB2BGR);
Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);
Utils.matToBitmap(dst, bitmap);
imageView.setImageBitmap(bitmap);
//
src.release();
temp.release();
dst.release();
} private void initView() {
imageView = (ImageView) findViewById(R.id.imageView);
button = (Button) findViewById(R.id.button);
button2 = findViewById(R.id.button2);
}
}
package cn.baldorange.myapplication.activities;

import androidx.appcompat.app.AppCompatActivity;
import cn.baldorange.myapplication.MainActivity;
import cn.baldorange.myapplication.R; import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc; import java.io.File;
import java.util.Date; public class CameraActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{ private String TAG = "OpenCV_Test";
//OpenCV的相机接口
private CameraBridgeViewBase mCVCamera;
//缓存相机每帧输入的数据
private Mat mRgba;
private Button button; /**通过OpenCV管理Android服务,初始化OpenCV**/
BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
Log.i(TAG, "OpenCV loaded successfully");
mCVCamera.enableView();
break;
default:break;
}
}
};
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what == ){
button.performClick();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
//初始化并设置预览部件
mCVCamera = (CameraBridgeViewBase) findViewById(R.id.camera_view);
mCVCamera.setCvCameraViewListener(this); //拍照按键
button = (Button) findViewById(R.id.deal_btn); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mRgba != null) {
if(!mRgba.empty()) {
Mat inter = new Mat(mRgba.width(), mRgba.height(), CvType.CV_8UC4);
Log.e("Mat","...............1...............");
//将四通道的RGBA转为三通道的BGR,重要!!
Imgproc.cvtColor(mRgba, inter, Imgproc.COLOR_RGBA2BGR);
Log.e("Mat","...............2...............");
File sdDir = null;
//判断是否存在机身内存
boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if(sdCardExist) {
//获得机身储存根目录
sdDir = Environment.getExternalStorageDirectory();
Log.e("Mat","...............3...............");
}
//将拍摄准确时间作为文件名
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
String filename = sdf.format(new Date());
String savepath=sdDir + "/Pictures/OpenCV/";
File f=new File(savepath);
if(!f.exists()){
f.mkdirs();
}
String filePath = sdDir + "/Pictures/OpenCV/" + filename + ".png";
Log.e("Mat","..............."+filePath+"...............");
//将转化后的BGR矩阵内容写入到文件中
Imgcodecs.imwrite(filePath, inter);
Toast.makeText(CameraActivity.this, "图片保存到: "+ filePath, Toast.LENGTH_SHORT).show();
}
}
}
}); // moveTaskToBack(true);
// new test().start();
}
private class test extends Thread{
@Override
public void run() {
super.run();
while (true){
try {
Thread.sleep();
Log.e("begin","kaishi........."); Message message = new Message();
message.what = ;
handler.sendMessage(message);
}catch (Exception e){
Log.e("error",e.getMessage());
}
}
}
}
@Override
protected void onResume() {
/***强制横屏***/
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
//横屏后才加载部件,否则会FC
if(!OpenCVLoader.initDebug()) {
Log.d(TAG, "OpenCV library not found!");
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
super.onResume();
} @Override
protected void onDestroy() {
if(mCVCamera != null) {
mCVCamera.disableView();
}
super.onDestroy();
} //对象实例化及基本属性的设置,包括长度、宽度和图像类型标志
public void onCameraViewStarted(int width, int height) {
Log.e("Mat","...............4...............");
mRgba = new Mat(height, width, CvType.CV_8UC4);
} /**图像处理都写在这里!!!**/
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba(); //一定要有!!!不然数据保存不进MAT中!!!
//直接返回输入视频预览图的RGB数据并存放在Mat数据中
Log.e("Mat","...............5...............");
return mRgba;
} //结束时释放
@Override
public void onCameraViewStopped() {
Log.e("Mat","...............6...............");
mRgba.release();
// mTmp.release();
}
}

四、运行结果

高强度学习训练第二天总结:Opencv+Android+CameraView小demo的更多相关文章

  1. 高强度学习训练第十三天总结:使用Netty实现一个http服务器

    Netty入门 Netty的重要性不言而喻.那么今天就来学习一下Netty. 整个项目基于Gradle搭建. Build如下所示: plugins { id 'java' } group 'cn.ba ...

  2. 高强度学习训练第十天总结:Class文件

    今天这Class文件看的我一脸懵圈.有种当初学PE时候的感觉了. 类文件结构 如果计算机的CPU指令集只有X86一种,操作系统也只有windows,那也许Java语言就不会出现.Java在诞生之初就提 ...

  3. 高强度学习训练第九天总结:5道剑指offer的题目

    实在不想看JVM了.刷几道剑指Offer的题,今天就水一水吧,脑子迷糊. 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增 ...

  4. 高强度学习训练第八天总结:MySQL的一些优化

    为什么要做MYSQL优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库中的数据会越来越多,处理时间会相应变慢. 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计 ...

  5. 高强度学习训练第六天总结:Redis主从关系总结

    Redis主从复制机制 1.读写分离的好处 性能优化:主服务器专注于写操作,可以更适合写入数据的模式工作:同样,从服务器专注于读操作,可以用更适合读取数据的模式工作. 强化数据安全,避免单点故障:由于 ...

  6. 高强度学习训练第十六天总结: Spring框架中的设计模式

    仔细想了想..没必要重复造轮子. 每天复习啥了就直接CTRL CV了 https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/system-de ...

  7. 高强度学习训练第十四天总结:HashMap

    HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一. JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap ...

  8. 高强度学习训练第十二天总结:Java hashCode和equals的关系

    今天要收拾东西.草草的总结下.. 1.如果两个对象相等,则hashcode一定也是相同的 2.两个对象相等,对两个对象分别调用equals方法都返回true 3.两个对象有相同的hashcode值,它 ...

  9. 高强度学习训练第十一天总结:Class文件结构(二)

    常量池 可以理解为Class文件之中的资源仓库,他是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一 访问标志 在常量池结束后,紧接着的俩个字节代表访问标 ...

随机推荐

  1. SQL Server Alwayson 主从数据库账号同步

    我们建立了Alwayson后,辅助副本下的数据库是没有相应的账号的,怎么样进行账号的同步呢?怎么在不知道密码的情况下,进行账号的同步设置. 我们可以通过SP--sp_help_revlogin 来实现 ...

  2. bayaim_杀神_全民飞机大战

    bayaim_杀神_全民飞机大战 ------------------------ 系统:IOS QQ:7742469490 王者:30 游戏名:神 级别:98 装备:满鸡 + 新战魂+ 歼31 + ...

  3. jQuery—获取表单标签的数据值

    获取设置input标签的值 <input class="form-control" type="text" id="username" ...

  4. win10 64位安装redis 及Redis Desktop Manager使用

    说多无益,先把redis在win上的开发环境搭一下. redis官方没有64位的Windows下的可执行程序,目前有个开源的托管在github上, 地址:https://github.com/Serv ...

  5. c# WF 第4节 窗体的事件

    本节内容: 1:事件是什么? 2:窗体事件在哪可以找到 3:事件有哪些 1:事件是什么? 2:窗体事件在哪里 第一种: 第二种: 3:事件有哪些

  6. Html学习之十六(表格与表单学习--课程表制作)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 接口是用get还是post,如何选择?

    为了保证信息安全性,注册.登录等操作通常都会使用POST请求,GET请求一般用来获取信息 GET与POST的区别可以参考下方链接 https://www.cnblogs.com/hyddd/archi ...

  8. day6_异常捕捉

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/11 14:14 # @Author : 大坏男孩 # @File : d ...

  9. [C11] 推荐系统(Recommender Systems)

    推荐系统(Recommender Systems) 问题阐述(Problem Formulation) 将 推荐系统 纳入这门课程来讲有以下两个原因: 第一.仅仅因为它是机器学习中的一个重要的应用.在 ...

  10. 剑指Offer-21.栈的压入、弹出序列(C++/Java)

    题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...