最近在尝试使用opencv4android实现投影仪的自动对焦功能,在AndroidStudio后需要将功能移到系统工程编译成系统app,仅以此文记录下移植过程中遇到的问题。

首先去opencv官网下载一份android的sdk, 然后在AndroidStudio中将opencv_android的sdk以module的方式导入工程,编译生成classes.jar,该文件包含了Opencv的api接口;具体方式可参考如下链接

    https://blog.csdn.net/PZ0605/article/details/72778547?locationNum=12&fps=1

生成jar文件的路径会在对应应用路径下面的,根据opencv版本不同,略有不同

    openCVLibrary340/build/intermediates/intermediate-jars/debug

获取jar文件后需要在Android.mk中导入该jar文件,以如下方式即可导入

LOCAL_STATIC_JAVA_LIBRARIES := \
opencv \
android-support-v4
include $(BUILD_PACKAGE) include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
opencv:lib/classes.jar
include $(BUILD_MULTI_PREBUILT)

这样,只要导入对应的包,就可以编译通过了。

下面讲下遇到的坑,大神请无视:

1.运行的时候提示unsatified link之类的错误,其实就是链接so失败了,后来阅读了下sdk代码后,在onResume中加入如下代码即可了

@Override
protected void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this, baseLoaderCallback);
}

2.由于我实现的是自动对焦,所有起初我使用的是Opencv的JavaCameraView来显示摄像头采集到的图像,但是每次运行的时候都报找不到资源的问题,然后我就舍弃了opencv的这种方式,采用了Android的Camera类来实现这一功能

3.在使用Camera类保存图像的时候,发现每次调用完camera.takePicture后数据采集就停止了,所以不得不在保存图像后再次调用了camera.startPreview();

4.后续在做的时候,发现可以在onPreviewFrame中直接保存图片,由于该函数的数据为YUV数据,所以转成jpg需要用到YuvImage类,通过其中的yuvImage.compressToJpeg可以将YUV数据成功保存成jpg图片

贴下实现的代码:

其中Rect中的width和height,表示显示的区域,可用于裁剪

Camera.Size size = camera.getParameters().getPreviewSize();
int w = size.width;
int h = size.height;
saveMyBitmap(FileName, bytes, w, h);
public static void saveMyBitmap(String filePath,byte[] data,int width,int high){
File f = new File(filePath);
try {
f.createNewFile();
} catch (IOException e) {
}
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
YuvImage yuvImage = new YuvImage(data,ImageFormat.NV21,width,high, null);
try {
yuvImage.compressToJpeg(new Rect(0,0,width,high),50,fOut);
}catch (Exception e){ }
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}

5.在做的时候,起初使用的SurfaceView,必须在SurfaceView中显示拍摄到的图像才能调用onPreviewFrame,感觉十分蛋疼,然后机缘巧合下找到了这个SurfaceTexture的实现方式:

    @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); getPermission();
surfaceviewer = (SurfaceView)findViewById(R.id.surfaceviewer);
imageView = (ImageView)findViewById(R.id.imv);
imageView.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.fouse)); surfaceholder = surfaceviewer.getHolder();
surfaceholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceholder.addCallback(AutoFouse.this); surfaceTexture = new SurfaceTexture(10);
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
// TODO Auto-generated method stub
// 获取camera对象
camera = Camera.open();
try {
// 设置预览监听
//camera.setPreviewDisplay(surfaceHolder);
camera.setPreviewTexture(surfaceTexture);

opencv4android移植到系统app的更多相关文章

  1. iOS系统app崩溃日志手动符号化

    iOS系统app崩溃日志手动符号化步骤: 1.在桌面建立一个crash文件夹,将symbolicatecrash工具..crash文件..dSYM文件放到该文件夹中 a.如何查询symbolicate ...

  2. 报课系统APP

    031302307黄丰润 031302343张晓燕 #NABCD模型分析 合理分析需求有助于说服客户,所以我们有如下分析 N(need)--客户需要什么 负责人需要将选课信息和选课表格一起发送给所负责 ...

  3. 获取设备上全部系统app信息

    在获取android设备的全部程序信息一文中介绍了获取手机上全部app信息的方法,以下介绍过滤掉系统app的方法: MainActivity: package com.home.getsysapp; ...

  4. 你我公益模式系统APP开发

    你我公益模式系统APP开发(微or电 158.1500.1390 小凡团队)你我公益系统开发,你我公益系统模式定制,你我公益系统开发软件,你我公益平台系统开发. 互联网世界无边无界,互联网创业者应敢于 ...

  5. 消费创富会开发模式系统App

    消费创富会系统定制开发,消费创富会网页开发模式,消费创富会开发软件,消费创富会系统APP开发,消费创富会平台模式开发,专业开发微信商城分销.公排.全返.分红.互助等模式定制开发,APP.网页版.微信端 ...

  6. 外呼系统APP外呼软件手机电销软件拨号销售软件功能设计

    外呼系统APP外呼软件 1 系统概述 该软件系统设计功能主要为贷款.投资.资产管理等金融中介公司提供方便快捷的线上管理各类资源的一款应用软件工具. 可根据不同职位的账号登录APP来管理电话营销.客户签 ...

  7. Android Studio搭建系统App开发环境

    一.前言 在Android的体系中开发普通app使用Android Studio这一利器会非常的方便.但是开发系统app可能就会有些吃力,不过经过一些配置仍然会 很简单.我们知道系统app因为涉及到一 ...

  8. ZLC众利币系统APP开发

    开发版本:APP 开发语言:php,java,.net 下面我们来看一下tp5 分页具体怎么用: 一, 分页简洁版 简洁分页仅仅只有上下页的分页输出,可以使用下面的简洁分页代码: // 查询状态为1的 ...

  9. 利用系统APP实现导航---By张秀清

    苹果系统本身自带一个地图APP,但是功能并不是很强大,但是一些简单的导航功能还是能做出来的,下面贴上我的代码 // // ViewController.m // 系统APP导航 // // Creat ...

随机推荐

  1. Redis入门教程(二)— 基本数据类型

    阅读以下内容时,手边打开一个redis-cli一起输入,输入命令敲击回车键前在心中想好你的答案,如果结果不合你的预期,请分析原因,使极大地提高学习效率.如果没有条件,每个数据类型后有代码运行结果,供你 ...

  2. Servlet的引入

    一.分析 此模式有问题: 1.jsp需要呼叫javabean StudentService stuService = new StudentServiceImpl(); List<Student ...

  3. 5.eclipse 自带的jdk没有源码,改了它

    其实JDK源码在安装的时候已经放在了jdk所在的目录下,只是eclipse使用 了不带有源码的jre,导致没找到对应的源码,点击 Window->Perference->Java-> ...

  4. PHP 7.2 RC3 on CentOS/RHEL 7.3 via Yum

    https://webtatic.com/packages/php72/ rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-lat ...

  5. CXF拦截器(Interceptor)LoggingInInterceptor

    Interceptor是CXF架构中一个重要的功能.你可以在不对核心模块进行修改的情况下,动态添加很多功能(你可以想象Struts2拦截器的优点).这对于CXF这个以处理消息为中心的服务框架来说是非常 ...

  6. Spring简单实现数据源的动态切换

    Spring简单实现数据源的动态切换: 1. 创建一个数据源切换类: 2. 继承AbstractRoutingDataSource,创建多数据源路由类,并注入到spring的配置文件中: 3. AOP ...

  7. Android Studio运行app时提示Error: Please select Android SDK

    最近开启了一个android项目,点“Run”键运行app,并报错Error:Please select Android SDK: 选择 File -> Project Structure 调整 ...

  8. qemu-kvm磁盘读写的缓冲(cache)的五种模式

    qemu-kvm磁盘读写的缓冲(cache)模式一共有五种,分别是writethrough, wirteback, none, unsafe, directsync当你对VM读写磁盘的性能有不同的要求 ...

  9. POJ - 1470 Closest Common Ancestors(离线Tarjan算法)

    1.输出测试用例中是最近公共祖先的节点,以及这个节点作为最近公共祖先的次数. 2.最近公共祖先,离线Tarjan算法 3. /* POJ 1470 给出一颗有向树,Q个查询 输出查询结果中每个点出现次 ...

  10. mac系统下显示隐藏文件

    在终端上输入以下命令即可: 显示隐藏文件命令: defaults write com.apple.finder AppleShowAllFiles -bool true 不显示隐藏文件命令: defa ...