Android 使用原生相机Camera在预览界面进行识别二维码或者图片处理

1 项目需求

最近项目中有个需求:使用原生相机在预览界面进行识别二维码和图片处理。其实这个需求不是很难,难在对预览画面的处理过程。

自己针对这个需求写了一个工具类,便于后续进行复盘,同时也分享给有类似需求的伙伴们。

2 遇到的问题

2.1 二维码识别成功率低

使用了第三方库,二维码成功率应该没有90%。我们客户要求比较高,二维码识别成功率要求几乎100%。后面会给出关键核心代码。现在先给出成功率不高的代码。

这里使用的第三方库是:
implementation ‘com.google.zxing:core:3.4.1’
implementation ‘com.journeyapps:zxing-android-embedded:3.6.0’


... 省略工具类其他部分代码,只看二维码识别部分代码private final Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {Camera.Parameters parameters = camera.getParameters();Camera.Size size = parameters.getPreviewSize();// 二维码识别decodeQRCode(data, size.width, size.height);}};/**  二维码识别  */
private void decodeQRCode(byte[] data, int width, int height) {MultiFormatReader reader = new MultiFormatReader();try {PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(data, width, height,0, 0, width, height, false);Result result = reader.decode(new BinaryBitmap(new HybridBinarizer(source)));if (result != null){Log.e(TAG, "扫码结果 = " + result.getText());}if (result != null && result.getText().length() > 0) {if (callback != null) {callback.onQRCodeScanned(true, result.getText());}} else {if (callback != null) {callback.onQRCodeScanned(false, "");}}} catch (Exception e) {Log.e(TAG, "扫码异常 = " + e.getMessage());if (callback != null) {callback.onQRCodeScanned(false, "");}}}

2.2 相机预览没物体时偶尔出现画面模糊

如下图。偶尔出现这样模糊画面。
在这里插入图片描述

3 相机工具类核心代码

实现主要流程:

1 打开相机
2 Camera 相关设置
3 预览时数据处理
4 关闭相机
/*** @author linvisf* * description: 相机工具类* //分辨率 1920 * 1088  1920 * 1080  1440 * 1080  1280 * 720  720 * 480  640 * 480  352 * 288  320 * 240*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K13021 - 小科坐地铁

题目描述 小科每天上学都是坐地铁的,所以他妈妈给他办了一张地铁卡,每次乘坐地铁出入闸机时刷卡就行。最近一段时间,小科想知道从家到学校要多长时间,所以从地铁公司调出了n次乘车的记录信息进行核算,手动核算太麻烦&…

掌握Go语言中的Channel:并发编程的核心

在Go语言的并发世界里,Channel 是一种至关重要的构建块,它允许不同goroutines之间的数据交换和同步。Channel的独特之处在于它能够以类型安全的方式,优雅地处理数据流和控制流,从而简化了并发编程的复杂性。 什么是Channel 在Go…

Codeforces Round 968 (Div. 2)(A,B,C,D1,D2)

比赛链接 这场还是有点东西的,这几个题都不难,但是要做对还是比较麻烦的。B是一个简单的博弈,C是鸽巢原理,D1是推一个结论,D2是一个dp,初始化比较烦人。 A. Turtle and Good Strings 题面: 乌…

由浅入深学习 C 语言:Hello World【提高篇】

目录 引言 1. Hello World 程序代码 2. C 语言角度分析 Hello World 程序 2.1. 程序功能分析 2.2 指针 2.3 常量指针 2.4 指针常量 3. 反汇编角度分析 Hello World 程序 3.1 栈 3.2 函数用栈传递参数 3.3 函数调用栈 3.4 函数栈帧 3.5 相关寄存器 3.6 相关汇编指令…

一些好用的网站和api合集

title: 集合一些好用的网站和api tags: 笔记收集 文章目录 内容先写这么多吧 以后有再加上去有好用的评论区也可以分享一下网站集合软件集合接口集合ONE金山词霸扇贝单词一言今日诗词Storm 往期内容基础库HAL cubemax VSCODE GCC 内容 这是一个关于一些网站的分享方便自己好…

速盾:深度解析云CDN及应用

云CDN(Content Delivery Network)是一种利用分布式节点服务器提供内容分发服务的技术。它能够将静态和动态的内容分发到离用户最近的服务器节点,从而提高用户访问速度和体验。云CDN在现代互联网应用中扮演着重要的角色,本文将深入…

优化学习管理:Moodle和ONLYOFFICE文档编辑器的完美结合

目录 前言 一、什么是 Moodle 1、简单快速插入表单字段 3、免费表单模板库 4、开启无缝协作 三、在Moodle中集成ONLYOFFICE文档 四、在Moodle安装使用ONLYOFFICE 1、下载安装 2、配置服务器 3、在Moodle中使用ONLYOFFICE 文档活动 五、未来展望 写在最后 前言 在当今教育科技飞…

C++(this指针/常函数与常对象/拷贝构造函数/赋值函数/静态成员/静态成员函数/单列模式)

一、this指针与常函数 成员函数是如何区别调用它的对象&#xff1f; #include <iostream> using namespace std; ​ class Test {const int num; public:Test(int num):num(num) {}void show(void){cout << num << " " << &num <&l…

Leetcode Hot 100刷题记录 -Day3(双指针)

移动零 问题描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2:…

Qt杂项功能实现

本文介绍Qt杂项功能实现。 1.隐藏鼠标指针 1)整个应用程序都不显示鼠标指针 可在“QApplication a(argc, argv);”之后添加&#xff1a; QApplication::setOverrideCursor(Qt::BlankCursor); 这在带触摸屏的应用中非常有用。 2)某个窗口不显示鼠标指针 可在窗口的构造函…

JVM垃圾回收算法:标记-清除算法 、复制算法、 标记-整理算法、 分代收集算法

文章目录 引言I 标记回收算法(Mark-Sweep)算法不足II 复制算法(Copying)III 标记整理算法(Mark-Compact)IV 分代收集(以上三种算法的集合体)内存划分新生代算法:Minor GC老年代算法V 查看JVM堆分配引言 垃圾回收(Garbage Collection,GC) Java支持内存动态分配、…

Flask+LayUI开发手记(六):树型表格的增删改查

树型表格的增删改查功能与数据表格的是完全一致&#xff0c;就是调用layui-form表单组件实现数据输入再提交&#xff0c;比较大的区别是树型节点的编辑&#xff0c;都需要有上级节点的输入&#xff0c;而这个上级节点的展示&#xff0c;必须是以树型方式展示出来。当然&#xf…

【大数据】Kaggle:数据科学家的竞技场与学习平台

文章目录 一、引言二、Kaggle是什么&#xff1f;Kaggle的核心特点包括&#xff1a; 三、Kaggle的用途四、如何使用Kaggle1. 注册账号2. 探索竞赛3. 下载数据集4. 使用Kernels5. 参与论坛讨论 五、Kaggle的高级功能1. Kaggle Kernels2. 数据集3. 论坛 六、Kaggle在教育和企业中的…

语音控制开关的语音识别ic芯片方案

语音控制开关是一种基于语音识别技术的设备&#xff0c;它通过内置的语音识别芯片&#xff0c;将用户的语音指令转化为电信号&#xff0c;从而实现对设备的控制。例如在智能家居设备上的应用&#xff0c;通常需要连接到家庭的Wi-Fi网络上&#xff0c;以便与智能手机或智能音箱等…

python os获取当前git目录的git用户

要获取当前目录下的 Git 用户配置&#xff08;即用户名称和电子邮件&#xff09;&#xff0c;你可以结合操作系统命令和 git 命令来完成这一任务。以下是使用 Python 的 os 模块和 subprocess 模块来获取当前 Git 目录的用户配置的示例代码&#xff1a; 使用 Python 脚本&…

golang RSA 解密前端jsencrypt发送的数据时异常 crypto/rsa: decryption error 解决方法

golang中 RSA解密前端&#xff08;jsencrypt&#xff09;发来的密文后出现 "crypto/rsa: decryption error" &#xff0c; 这个问题首先需要确认你的私匙和公匙是否匹配&#xff0c; 如果匹配 那检查入参数据类型&#xff0c; 前端发送来的rsa加密后的数据一般都是…

bbr 随机 phase 的麻烦与 inflight 守恒算法的动机

bbr 有个要点&#xff0c;要把 probebw 的 phase 错开&#xff1a; static void bbr_reset_probe_bw_mode(struct sock *sk) {struct bbr *bbr inet_csk_ca(sk);bbr->mode BBR_PROBE_BW;bbr->cycle_idx CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand);bbr_advance…

【Java设计模式】集合管道模式:简化数据操作

文章目录 【Java设计模式】集合管道模式&#xff1a;简化数据操作一、概述二、集合管道设计模式的意图三、集合管道模式的详细解释及实际示例四、Java中集合管道模式的编程示例五、何时在Java中使用集合管道模式六、集合管道模式在Java中的实际应用七、集合管道模式的优点和权衡…

【封装自己的库】

封装自己的库 课前准备 工具 编辑器 VSCode浏览器 Chorme 前置知识 Js基本知识 课堂主题 一、定义函数返还JQ对象 二、ready方法和原生节点处理 三、选择器器封装 四、封装JQ的eq方法 五、封装JQ的click方法 六、jQ中的链式操作 七、封装JQ的css方法 八、cssHooks扩…

Java项目:基于SpringBoot+mysql在线拍卖系统(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SSM框架mysql在线拍卖系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐全、…