Android studio环境配置不再赘述,可以参照我的其他博客。 
Android应用程序开发环境搭建:http://blog.csdn.net/ja33son/article/details/61192072

Opencv-android-sdk:链接:http://pan.baidu.com/s/1boI67nh 密码:umu2

新建项目后,File-New-Import Module,选择解压后sdk中android项目的路径:opencv-3.2.0-android-sdk\OpenCV-android-sdk\sdk\java,引入module!

出现错误了不要紧,先不去管它,切换到project界面下,打开app的build.gradle文件,以及引入的module的build.gradle文件。将app中build.gradle的部分字段复制到module中,字段包括compileSdkVersion、buildToolsVersion、minSdkVersion、targetSdkVersion,复制到对应位置,目的是为了使两个module的编译环境相同。不这么做,就报错给你看。

不要忘记,改变build.gradle以后,Sync你的工程。

下一步是很关键的,将解压后的库文件(opencv-3.2.0-android-sdk\OpenCV-android-sdk\sdk\native\下的libs文件夹)添加到项目目录(app/src/main/)中。要将目录名字改为jniLibs。 
注:我们使用到的库,只有每个平台文件夹(arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64)下的libopencv_java3.so,感兴趣的同学可以将其他库移除,会有效减小apk体积。也可以使用Lint Cleaner Plugin或者AndroidStudio自带的瘦身工具,这里不做演示。

之后,将引入的module作为外部库项目导入到app中,开发环境就搭建好了。 
注:Project Structure的快捷键是Ctrl+Shift+Alt+s

环境搭建完成后,就可以做一些简单的工作了。以下是获取opencv camera图像数据,并对图像进行简单处理的demo。


首先是Manifest.xml配置文件,声明一下相机的权限。由于Android M以后,权限机制改变,只声明已经失效了,需要在activity中申请,后面会详细说明。

添加以下权限: 
<uses-permission android:name="android.permission.CAMERA" />

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ja3son.cvcamera"> <uses-permission android:name="android.permission.CAMERA" /> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

然后是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:opencv="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"> <org.opencv.android.JavaCameraView
android:id="@+id/camera_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
opencv:show_fps="true" /> </FrameLayout>

在引入org.opencv.android.JavaCameraView的时候,preview窗口可能会报错,只需要在preview窗口提示的信息中,点击一下build,就可以解决了。 
注:以上解决方法在Android Studio2.3中适用,其他版本中没有进行测试,即使现在不build,最后运行项目的时候也会build的。以上方法只提供给强迫症患者

JavaCameraView就是提供相机预览的类了,但让人失望的是,JavaCameraView没有调用Camera API2接口,而是使用老版本Camera API1。后续会做opencv接入Camera API2的东西,感兴趣的同学可以持续关注。


之后就是Activity文件:

import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat; public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { private JavaCameraView camera_view;
private int M_REQUEST_CODE = 203;
private String[] permissions = {Manifest.permission.CAMERA}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
camera_view = (JavaCameraView) findViewById(R.id.camera_view);
camera_view.setCvCameraViewListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissions, M_REQUEST_CODE);
}
} @Override
protected void onPause() {
super.onPause();
if (camera_view != null) {
camera_view.disableView();
}
} @Override
protected void onResume() {
super.onResume();
if (OpenCVLoader.initDebug()) {
camera_view.enableView();
}
} @Override
protected void onDestroy() {
super.onDestroy();
if (camera_view != null) {
camera_view.disableView();
}
} @Override
public void onCameraViewStarted(int width, int height) {
} @Override
public void onCameraViewStopped() {
} @Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
return inputFrame.rgba();
}
}

简单解释一下activity中进行的操作:

activity实现CameraBridgeViewBase.CvCameraViewListener2接口,实现对camera数据的监听和控制。

onCreate方法中初始化View,申请权限,设置监听。camera_view.setCvCameraViewListener(this)设置监听后,重写方法就可以获得camera预览数据了。直接调用requestPermissions方法,就会在程序初始化时弹出系统预制的权限申请对话框,在Android N中是如此,其他版本中未验证。由于此代码只是demo,且本人懒,所以没做权限拒绝申请相关的处理,感兴趣的同学可以实现onRequestPermissionsResult方法进行控制。

onResume方法中初始化opencv库,初始化成功,则进行camera_view.enableView()操作,使view开始预览。如果全部按照前面步骤操作,就不存在初始化库失败的情况。如果存在,请参考前文,重新来过。

onCameraFrame方法中只是返回了原始图像,return inputFrame.rgba()。这时运行程序,就能在屏幕上看到相机的图像了。只不过图像是横着的,因为我懒,没旋转。以下代码是对图像进行简单图像处理的代码,将

    @Override
public void onCameraViewStarted(int width, int height) {
} @Override
public void onCameraViewStopped() {
} @Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
return inputFrame.rgba();
}

全部替换为:

    private Mat mCannyResult;

    @Override
public void onCameraViewStarted(int width, int height) {
mCannyResult = new Mat(height, width, CvType.CV_8UC1);
} @Override
public void onCameraViewStopped() {
mCannyResult.release();
} @Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
Imgproc.Canny(inputFrame.gray(), mCannyResult, 60, 80);
return mCannyResult;
}

结果图就是

对图像的处理可以简单说明一下: 
在StartCamera的时候,初始化一个Mat,这个Mat是8位无符号整形单通道矩阵(CvType.CV_8UC1),为什么是单通道呢?都知道RGB是三个通道,每个颜色一个,RGBA是四通道,多出一个Alpha透明度通道。灰度图,不需要颜色通道,所以一个通道就够了。因为我们只需要取灰度数据就足够检测边缘了,没错,我们对图像简单的处理就是Canny检测边缘。 
有了Mat以后,在onCameraFrame方法中,调用Imgproc.Canny(inputFrame.gray(), mCannyResult, 60, 80)方法,简单说一下参数,第一个为原始数据,就是camera预览的灰度图。第二个是输出图像,就是Canny以后的数据。后两个double类型的参数,就是边缘检测的阈值边界。以例子为准的话,低于60的点不算作边缘。在60与80之间的点,参考周围点,如果周围有边界点,则记为边缘点。高于80的点,为边缘点。

以上就是opencv的入门demo了,结合这个就可以做很多有意思的东西了。后续会做android studio 结合NDK开发opencv的例子,敬请关注。

opencv-android笔记1:android studio 2.3 + opencv-android-sdk 实现 camera预览的更多相关文章

  1. Android 发布可穿戴设备 SDK 的开发者预览版

    今早上安卓官网查资料,发现网站上赫然显示着"Android Wear"几个大字.难道……?点进去看,果然,Android发布了可穿戴设备的SDK的开发者预览版. 其中这第五张图…… ...

  2. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...

  3. Android手势识别 Camera 预览界面上显示文字 布局注意事项(merge布局)

    通常在Surfaceview作为预览视频帧的载体,有时需在上面显示提示文字.曾经我弄的都好好的.今天忽然发现叠加的TextView不管咋弄都出不来文字了,跟Surfaceview一起放在FrameLa ...

  4. Android流媒体开发之路一:Camera2采集摄像头原始数据并手动预览

    Android Camera2采集摄像头原始数据并手动预览 最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在Te ...

  5. 【openCV学习笔记】在Mac上配置openCV步骤详解

    (1)安装Homebrew:(需要Ruby) 注:因为snow leopard 以后已经自带Ruby了,所有可以不用自己安装Ruby. 看一下Homebrew的官网: http://mxcl.gith ...

  6. Android Camera 预览图像被拉伸变形的解决方法【转】

    问题描述: 预览图像被拉伸变形 问题原因: 由于预览图像大小跟SurfaceView 大小不一致引起 解决方法: 获取系统支持的所有预览尺寸[getSupportedPictureSizes],然后再 ...

  7. [转]【android studio】解决layout预览出现Rendering Problems Exception Unable to find the layout for Action Bar.

    在android studio中打开layout文件,发现不能预览布局,提示以下错误: Rendering Problems Exception raised during rendering: Un ...

  8. Android Studio xml文件中的布局预览视图

    操作系统:Windows 10 x64 IDE:Android Studio 3.3.1 更新了Android Studio之后,xml文件中的布局预览视图变得如此简洁! 原因是没有勾选Show La ...

  9. Android Camera2 预览,拍照,人脸检测并实时展现

    https://www.jianshu.com/p/5414ba2b5508 背景     最近需要做一个人脸检测并实时预览的功能.就是边检测人脸,边在预览界面上框出来.     当然本人并不是专门做 ...

随机推荐

  1. FFT 【JSOI2012】bzoj4332 分零食 (未解决)

    很不错的一道倍增优化dp?? 第一次做这类题挺难想的 题目大意: 有n个小朋友,m块糖. 给小朋友分糖,如果一个小朋友分不到糖,那他后面的小朋友也分不到糖. 每个小朋友有一个喜悦值,有三个参数,O,S ...

  2. Python字符串相加以及字符串格式化

    1.在Python中字符串a占用一块内存地址,字符串b也占用一块内存地址,当字符串a+b时,又会在内存空间中开辟一块新的地址用来存放a+b. a 地址一 b 地址二 a+b 地址三 因此内存中就占了三 ...

  3. BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1898 题意概括 有一个无向图. 其中,有许多条鱼在以循环的规律出现,比如循环在1,2,3这些点出现 ...

  4. 第八章| 1. MySQL数据库|库操作|表操作

    1.初识数据库 我们在编写任何程序之前,都需要事先写好基于网络操作一台主机上文件的程序(socket服务端与客户端程序),于是有人将此类程序写成一个 专门的处理软件,这就是mysql等数据库管理软件的 ...

  5. 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...

  6. Redis数据结构之list

    一:介绍 1.存储list ArrayList使用数组的方式 LinkedList使用双向链接的方式 二:Redis客户端 1.左端与右端插入 2.左端查询 3.左端与右端弹出 4.长度 5.在头部插 ...

  7. 大数据小视角5:探究SSD写放大的成因与解决思路

    笔者目前开发运维的存储系统的服务器都跑在SSD之上,目前单机服务器最大的SSD容量有4T之多.(公司好有钱,以前在实验室都只有机械硬盘用的~~)但SSD本身的特性与机械硬盘差距较大,虽然说在性能上有诸 ...

  8. postcss那些事儿

    一.sass和postcsssass.less.stylus,三者是css预处理器,使用预编码来处理css,然后编译成线上需要的css.postcss是处理你写好的css,让你的css更健康,对浏览器 ...

  9. PHP 利用QQ邮箱发送邮件「PHPMailer」

    在 PHP 应用开发中,往往需要验证用户邮箱.发送消息通知,而使用 PHP 内置的 mail() 函数,则需要邮件系统的支持. 如果熟悉 IMAP/SMTP 协议,结合 Socket 功能就可以编写邮 ...

  10. HTML篇之CSS样式:<button></button>按钮变成超链接<a></a>的样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...