opencv4android移植到系统app
最近在尝试使用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的更多相关文章
- iOS系统app崩溃日志手动符号化
iOS系统app崩溃日志手动符号化步骤: 1.在桌面建立一个crash文件夹,将symbolicatecrash工具..crash文件..dSYM文件放到该文件夹中 a.如何查询symbolicate ...
- 报课系统APP
031302307黄丰润 031302343张晓燕 #NABCD模型分析 合理分析需求有助于说服客户,所以我们有如下分析 N(need)--客户需要什么 负责人需要将选课信息和选课表格一起发送给所负责 ...
- 获取设备上全部系统app信息
在获取android设备的全部程序信息一文中介绍了获取手机上全部app信息的方法,以下介绍过滤掉系统app的方法: MainActivity: package com.home.getsysapp; ...
- 你我公益模式系统APP开发
你我公益模式系统APP开发(微or电 158.1500.1390 小凡团队)你我公益系统开发,你我公益系统模式定制,你我公益系统开发软件,你我公益平台系统开发. 互联网世界无边无界,互联网创业者应敢于 ...
- 消费创富会开发模式系统App
消费创富会系统定制开发,消费创富会网页开发模式,消费创富会开发软件,消费创富会系统APP开发,消费创富会平台模式开发,专业开发微信商城分销.公排.全返.分红.互助等模式定制开发,APP.网页版.微信端 ...
- 外呼系统APP外呼软件手机电销软件拨号销售软件功能设计
外呼系统APP外呼软件 1 系统概述 该软件系统设计功能主要为贷款.投资.资产管理等金融中介公司提供方便快捷的线上管理各类资源的一款应用软件工具. 可根据不同职位的账号登录APP来管理电话营销.客户签 ...
- Android Studio搭建系统App开发环境
一.前言 在Android的体系中开发普通app使用Android Studio这一利器会非常的方便.但是开发系统app可能就会有些吃力,不过经过一些配置仍然会 很简单.我们知道系统app因为涉及到一 ...
- ZLC众利币系统APP开发
开发版本:APP 开发语言:php,java,.net 下面我们来看一下tp5 分页具体怎么用: 一, 分页简洁版 简洁分页仅仅只有上下页的分页输出,可以使用下面的简洁分页代码: // 查询状态为1的 ...
- 利用系统APP实现导航---By张秀清
苹果系统本身自带一个地图APP,但是功能并不是很强大,但是一些简单的导航功能还是能做出来的,下面贴上我的代码 // // ViewController.m // 系统APP导航 // // Creat ...
随机推荐
- 一个很小的C++写的MVC的例子
#include<iostream> #include<vector> //get namespace related stuff using std::cin; using ...
- 2016/3/18 ①PHP基础 ② PHP函数 ③其他函数(随机数、关于日期) ④正则表达式 ⑤字符串处理
一.PHP基础 1,标记和注释 ①<?php?> ②单行注释// 多行注释/** */2, 输出语句 ①echo输出 echo可以输出多个字符串,用逗号隔开. ②print输出 pr ...
- mysql工作原理(网络搜索整理的)
原文网址:Mysql 工作原理 原文网址:MySQL运行原理与基础架构 mysql基本用法原文网址:MySQL(一):基本原理 SQL 语句执行过程 数据库通常不会被直接使用,而是由其他编程语言通过S ...
- (22) java web的struts2框架的使用-struts配置文件
1,配置文件的引用 struts中配置文件可以有多个,每个模块的包里面都可以单独设立一个struts配置文件. 主的配置文件,放在“src”文件夹下,可以引入其他配置文件,引入方式: <!-- ...
- YTU 2851: 数字游戏
2851: 数字游戏 时间限制: 1 Sec 内存限制: 128 MB 提交: 164 解决: 85 题目描述 输入若干个正整数,将其中能写成其它两个正整数的平方和的数输出来. 例,若输入的数中有 ...
- 闲得蛋疼,JavaScript版本BadApple
参考Vim版本的BadApple改写而成.由于加载数据比较大,可能网速不给力的童鞋效果不太好,多刷新几次就好了,^_^.运行环境:支持HTML5 Canvas的浏览器.1. 代码:$(functio ...
- OSD锁定怎么解锁?
方法是这样的: 先按中间的建关掉显示器电源,关了显示器后按住左键,在按中间的建开机,这时屏幕闪一下就解锁了.在按中间的建打开显示器就行了. 加锁的方法和解锁一样
- sql 指删除表,改表名,改字段名
删除表: DECLARE @Table NVARCHAR(30) DECLARE tmpCur CURSOR FOR SELECT name FROM sys.objects WHERE TYPE=' ...
- Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试
ylbtech-Java-Runoob-高级教程-实例-字符串:11. Java 实例 - 字符串性能比较测试 1.返回顶部 1. Java 实例 - 字符串性能比较测试 Java 实例 以下实例演 ...
- 《Deep Learning Face Attributes in the Wild》论文笔记
论文背景: IEEE International Conference on Computer Vision 2015 Ziwei Liu1, Ping Luo1, Xiaogang Wang2, X ...