最近在尝试使用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. Spring3+ibatis (SQL Server)+pager-taglib.tld查询分页的实现

    pager-taglib分页開始~ 查了好多关于分页的技术,终于选定下面方法实现~ 1.首先下载jar包:pager-taglib.jar,pager-taglib.jar放在WEB-INF/lib文 ...

  2. asp.net mvc + javascript生成下载文件

    近期做的是对现有项目进行重构.WEB FROM改成MVC,其实也算是推倒重来了. 里面有一个导出功能,将数据输出成txt文件,供下载.原先的做法是有一个隐藏的iframe,在这个iframe的页面中设 ...

  3. Hibernate 之 Locking

    在我们业务实现的过程中,往往会有这样的需求:保证数据访问的排他性,也就是我正在访问的数据,别人不能够访问,或者不能对我的数据进行操作.面对这样的需求,就需要通过一种机制来保证这些数据在一定的操作过程中 ...

  4. C中使用memset

    int i; cout<<memset(&i,1,sizeof(int))<<endl; 输出结果是16843009,而不是填充的1111 1111,为什么呢? 因为m ...

  5. form之action的绝对路径与相对路径(转载)

    1.当你的form要提交到你自己的站点之外的URL的时候,就采取绝对路径: <form action="http://www.xxx.yyy:zzzz/mmm/nn/kkk.jsp&q ...

  6. 在ubuntu18.0下安装qt4.7以及qt-creator安装过程中遇到的坑

    最近的嵌入式Linux系统上要做课程设计= =要用贼老贼老的qt4.7,配环境踩坑都费了我1天时间.....所以记录下来,希望能给和我遇到相同问题的朋友一点帮助 apt-get install g++ ...

  7. caioj1097: [视频]树状数组1(快速求和计算) cdq分治入门

    这题虽然是个树状数组,但是也可以用cdq分治做啊~~,这个就是一个浅显的二维偏序的应用? cdq分治和普通的分治有什么区别? 举个栗子:有4个小朋友,你请他们吃饭,假如你分治搞,就会分成很多子问题—— ...

  8. Ubuntu linux 返回上一次访问的目录

    cd - (cd空格 减号)返回最近一次访问的目录 这个非常方便.平时经常用终端切换目录,能够方便地回到原来的目录就很爽了. jiqing@jiqing-pad:/usr/local/redis/sr ...

  9. python 列表,元祖,字典

    一 列表 1 列表的循环遍历 namesList = ['xiaoWang','xiaoZhang','xiaoHua'] for name in namesList: print(name) 结果 ...

  10. 解决UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position xxx ordinal not in range(128)

    Python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错UnicodeDecodeError: 'ascii' codec can't deco ...