JetpackCompose百度人脸识别DEMO

news2024/9/9 1:31:19

我今天才正式学习android原生开发,因为我上来创建新项目中默认使用的就是Jetpack Compose框架的。于是我就用Jetpack Compose开发我的应用了。但是在做人脸识别时就遇到了很多问题。

我在用Compose框架开发相机相关应用时,发现设备无法拍照,而在模拟器中是正常可以拍照的。
处理这个问题时,因为我是周末加班做的,设备厂商没有上班,就导致我这两天也没有解决掉。直到厂家技术人员上班我才得到回复:

因为860是usb摄像头,跟Android标准Camera接口(正常是适用于手机这种的mipi摄像头)融合得不全面
骁龙相机不要用,检测摄像头之类的采用整机测试的主、副摄像头测试
App人脸识别也只会用到Camera的预览,不会用到拍照
预览图像用于人脸识别,哪怕你要保存现场照片,也是直接预览数据保存,不用拍照

知道原因后,厂家给我的demo是用传统的写法,而且依赖的各种库版本相对旧,我一时半会儿无法应用到项目之中,又耗时一天才找到解决办法。

直到我找到了这个开源项目:https://github.com/YanneckReiss/JetpackComposeMLKitTutorial

核心代码

我只列出我核心修改的代码,其他代码都是来源于以上项目中的。
TextRecognitionAnalyzer.kt

package de.yanneckreiss.mlkittutorial.ui.camera

import android.graphics.Bitmap
import android.media.Image
import android.util.Base64
import androidx.annotation.OptIn
import androidx.camera.core.ExperimentalGetImage
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import org.json.JSONObject
import java.io.ByteArrayOutputStream
import java.nio.ByteBuffer


class TextRecognitionAnalyzer(
    private val onDetectedTextUpdated: (String) -> Unit
) : ImageAnalysis.Analyzer {

    companion object {
        const val THROTTLE_TIMEOUT_MS = 5_000L
        const val API_KEY = "xxxxxxxx"
        const val SECRET_KEY = "xxxxxxxxxxxx"
        val HTTP_CLIENT: OkHttpClient = OkHttpClient.Builder().build()
    }
    private val scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())

    @OptIn(ExperimentalGetImage::class)
    override fun analyze(imageProxy: ImageProxy) {
        scope.launch {
            val bitmap:Bitmap = imageProxy.toBitmap()
            val byteArrayOutputStream = ByteArrayOutputStream()
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream)
            val byteArray = byteArrayOutputStream.toByteArray();
            val base64String = Base64.encodeToString(byteArray, Base64.DEFAULT)

            val accessToken = getAccessToken()
            val response = requestFaceRecognition(base64String, accessToken)

            println(response)

            delay(THROTTLE_TIMEOUT_MS)
        }.invokeOnCompletion { exception ->
            exception?.printStackTrace()
            imageProxy.close()
        }
    }

    private fun getAccessToken(): String {
        val mediaType = "application/x-www-form-urlencoded".toMediaTypeOrNull()
        val body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=$API_KEY&client_secret=$SECRET_KEY")
        val request = Request.Builder()
            .url("https://aip.baidubce.com/oauth/2.0/token")
            .post(body)
            .addHeader("Content-Type", "application/x-www-form-urlencoded")
            .build()
        val response = HTTP_CLIENT.newCall(request).execute()
        val jsonObject = JSONObject(response.body?.string() ?: "")
        return jsonObject.getString("access_token")
    }

    private fun requestFaceRecognition(base64Image: String, accessToken: String): String {
        val mediaType = "application/json".toMediaTypeOrNull()
        val json = JSONObject().apply {
            put("group_id_list", "pay")
            put("image", base64Image)
            put("image_type", "BASE64")
        }
        val body = RequestBody.create(mediaType, json.toString())
        val request = Request.Builder()
            .url("https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=$accessToken")
            .post(body)
            .addHeader("Content-Type", "application/json")
            .build()
        val response = HTTP_CLIENT.newCall(request).execute()
        return response.body?.string() ?: ""
    }
}

代码下载

https://download.csdn.net/download/lxyoucan/89597203

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

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

相关文章

瑞芯微平台RK3568系统开发(2)Camera 开发2

基于上文,继续 瑞芯微平台RK3568系统开发(2)Camera 开发1-CSDN博客 1、使用v4l2-ctl说明 media-ctl工具的操作是通过/dev/medio0等media设备,它所管理是media的拓扑结构中各个节点的format,大小,链接。 …

CTF学习笔记汇总(非常详细)零基础入门到精通,收藏这一篇就够了

CTF学习笔记汇总 Part.01 Web 01 SSRF 主要攻击方式如下: 01 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。 02 攻击运行在内网或本地的应用程序。 03 对内网Web应用进行指纹识别,识别企业内部的资产信息。 …

Studying-代码随想录训练营day45| 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

第45天,子序列part03,编辑距离💪(ง •_•)ง,编程语言:C 目录 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇 115.不同的子序列 文档讲解:代码随想录不同的子序列 视频讲…

高效能程序员的9个习惯

最近看了一本关于敏捷软件开发实践的指南,他文中主要是在帮助软件开发者和团队提升工作效率、提高产品质量,并建立良好的工作文化和协作模式。以下是根据目录整理出的一段总结: 书名:《敏捷之道》 本书深入探讨了敏捷开发的核心原…

从 1 到 100 万+连接数,DigitalOcean 负载均衡的架构演进

在前不久,DigitalOcean 全球负载均衡器(GLB)Beta版正式上线。该解决方案能给客户的跨区域业务带来更好的支持,可以增强应用程序的弹性,消除单点故障,并大幅降低终端用户的延迟。这是 DigitalOcean 负载均衡…

Python写UI自动化--playwright(pytest.ini配置)

在 pytest.ini 文件中配置 playwright 的选项可以更好地控制测试执行的过程。 在终端输入pytest --help,可以找到playwright的配置参数 目录 1. --browser{chromium,firefox,webkit} 2. --headed 3. --browser-channelBROWSER_CHANNEL 4. --slowmoSLOWMO 5. …

魔众文库-PHP文库管理系统

魔众文库是一套基于PHPMYSQL开发的适用于多平台的文档管理系统,提供doc、ppt、excel、pdf、压缩包、图片、CAD 等资源的在线预览和下载,文件被转换为H5或图片格式,文字放大无失真,响应速度更快速对SEO更友好,收录更快、…

NFTScan | 07.22~07.28 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2024.07.22~ 2024.07.28 NFT Hot News 01/ 数据:NFT 系列 Liberty Cats 地板价突破 70000 MATIC 7 月 22 日,据 Magic Eden 数据,NFT 系列 Liberty C…

内网隧道学习笔记

1.基础: 一、端口转发和端口映射 1.端口转发是把一个端口的流量转发到另一个端口 2.端口映射是把一个端口映射到另一个端口上 二、http代理和socks代理 1.http带那里用http协议、主要工作在应用层,主要用来代理浏览网页。 2.socks代理用的是socks协议、…

c# string记录

c# srting 的操作例子 在C#中,string 类型是一个不可变(immutable)的引用类型,表示文本。由于它的不可变性,对字符串的任何修改操作实际上都会返回一个新的字符串实例。以下是一些常见的 string 操作例子: …

Hvv第二周,喝了3瓶红牛,心慌、头晕,我还行么?

Hvv第二周了,你们的物资挥霍的怎么样了啊?今天看到群里有小伙伴说喝了3瓶红牛,结果现在搞得头晕晕的,很慌。 Hvv物资来由 这不仅让我想来聊聊护网物资的来由和发展,也让后来进入网安这个行业的小伙伴了解一下&#xf…

【Plotly-驯化】一文教您画出Plotly中动态可视化饼图:pie技巧

【Plotly-驯化】一文教您画出Plotly中动态可视化饼图:pie技巧 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内…

逻辑漏洞复现(pikachu靶场,大米cms)

逻辑漏洞 漏洞介绍 1.成因 逻辑漏洞是指由于程序逻辑不严或逻辑太复杂,导致一些逻辑分支不能够正常处理或处理错误,一般出现任意密码修改(没有旧密码验证)、越权访问、密码找回、交易支付金额等。 2. 分析 对常见的漏洞进行过…

Qt Phonon多媒体框架详解及简单实例分享

目录 1、Phonon 简介 2、Phonon基本类 2.1、VideoPlayer类 2.2、MediaObject类 2.3、Phonon::createPath() 2.4、AudioOutput类 2.5、VideoWidget Class 2.6、SeekSlider类 2.7、VolumeSlider类 3、Phonon 完整使用实例 4、总结 C++软件异常排查从入门到精通系列教程…

ChatGPT小狐狸AI付费创作系统v3.0.3+前端

小狐狸GPT付费体验系统的开发基于国外很火的ChatGPT,这是一种基于人工智能技术的问答系统,可以实现智能回答用户提出的问题。相比传统的问答系统,ChatGPT可以更加准确地理解用户的意图,提供更加精准的答案。同时,小狐狸…

项目管理“四管”法则

在项目管理中,“四管”的具体内容可能因不同的项目管理框架和实践而有所不同。但一般而言,它们可以概括为与项目成功密切相关的四个关键管理领域。以下是项目管理中“四管”: 一、人力资源管理(管人) 项目团队是项目…

AMQP-核心概念-终章

本文参考以下链接摘录翻译: https://www.rabbitmq.com/tutorials/amqp-concepts 连接(Connections) AMQP 0-9-1连接通常是长期保持的。AMQP 0-9-1是一个应用级别的协议,它使用TCP来实现可靠传输。连接使用认证且可以使用TLS保护…

Python 进行数据可视化(Matplotlib, Seaborn)

数据可视化是数据科学和分析中的重要工具,它通过图形表示数据,使得复杂的数据变得易于理解和分析。在Python中,最常用的两个数据可视化库是Matplotlib和Seaborn。 Matplotlib 1. 简介 Matplotlib是一个用于生成二维图形的Python库。它提供…

深入浅出消息队列----【阶段总结篇】

深入浅出消息队列----【阶段总结篇】 总览nameSrvBrokerproducer(生产者)consumer(消费者) 串联起来 本文仅是文章笔记,整理了原文章中重要的知识点、记录了个人的看法 文章来源:编程导航-鱼皮【yes哥深入浅…