首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >相机预览流中的ML条形码扫描器?

相机预览流中的ML条形码扫描器?
EN

Stack Overflow用户
提问于 2018-12-18 17:42:16
回答 2查看 2.3K关注 0票数 1

我正在尝试做一个使用ML套件条形码检测器,camera2应用编程接口和Kotlin的条形码扫描仪。关于camera2我从关于ML套件条形码检测器的谷歌示例camera2basic开始,我从Scan Barcodes with ML Kit on Android开始

在Camera2BasicFragment / createCameraPreviewSession方法中,我添加了

代码语言:javascript
运行
AI代码解释
复制
previewRequestBuilder.addTarget(imageReader!!.surface)

因此,每当有图像可用时,都会调用onImageAvailableListener。

在Camera2BasicFragment / setUpCameraOutputs方法中,我将ImageReader的ImageFormat.JPEG更改为ImageFormat YUV420_888,因此在onImageAvailableListener中,ImageReader提供YUV图像

下面是我的onImageAvailableListener:

代码语言:javascript
运行
AI代码解释
复制
   private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
        val metadata = FirebaseVisionImageMetadata.Builder()
            .setWidth(480)   // 480x360 is typically sufficient for
            .setHeight(360)  // image recognition
            .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_YV12)
            .setRotation(getRotationCompensation(cameraId, activity as Activity, context!!))
            .build()
        BarcodeReader(it.acquireNextImage(), detector, metadata, mListener).run()
    }

在元数据中,'width‘和'heigth’是ML工具包文档中建议的格式,' format‘是YV12,用于处理YUV格式

条形码阅读器是:

代码语言:javascript
运行
AI代码解释
复制
class BarcodeReader (private val image: Image,
                     private val detector: FirebaseVisionBarcodeDetector,
                     private val metadata: FirebaseVisionImageMetadata,
                     private val mListener: IBarcodeScanner) : Runnable {
    override fun run() {
        val visionImage = FirebaseVisionImage.fromByteBuffer(image.planes[0].buffer, metadata)
        detector.detectInImage(visionImage)
            .addOnSuccessListener { barcodes ->
                // Task completed successfully
                // [START_EXCLUDE]
                // [START get_barcodes]
                for (barcode in barcodes) {
                    val bounds = barcode.boundingBox
                    val corners = barcode.cornerPoints

                    val rawValue = barcode.rawValue

                    if (rawValue!=null)
                        mListener.onBarcode(rawValue)
                }
                // [END get_barcodes]
                // [END_EXCLUDE]
            }
            .addOnFailureListener {
                // Task failed with an exception
                // ...
                Log.d("barcode", "null")
            }
        image.close()
    }

detector.detectInImage进入onSuccessListener但未检测到条形码:barcodes数组始终为空。

有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2019-02-11 20:26:58

您需要将所有三个平面的数据传递给FirebaseVisionImage.fromByteBuffer()函数。您的代码只移交第一个(Y平面)。YV12格式使用一个缓冲区(数组),其中包含Y数据,然后是U数据,然后是V数据。

图像包含三个单独的缓冲区,用于三个值(Y、U和V),但实际帧需要在一个缓冲区(数组)中包含所有这三个缓冲区。因此,您需要创建一个缓冲区,并根据格式(YV12或NV21)以正确的顺序将三个平面的内容复制到其中,然后移交该缓冲区(数组)。

请参阅this Wikipedia article和此SO问题/答案,其中包含有关YV12和NV21格式的转换和布局的更多信息。关于这些格式的另一个很好的来源是VideoLan维基。

函数可能如下所示:

代码语言:javascript
运行
AI代码解释
复制
override fun onImageAvailable(reader: ImageReader) {
    val image = imageReader?.acquireLatestImage() ?: return
    val planes = image.planes
    if (planes.size >= 3) {
        val y = planes[0].buffer
        val u = planes[1].buffer
        val v = planes[2].buffer
        val ly = y.remaining()
        val lu = u.remaining()
        val lv = v.remaining()

        val dataYUV = ByteArray(ly + lu + lv)
        y.get(dataYUV, 0, ly)
        u.get(dataYUV, ly, lu)
        v.get(dataYUV, ly + lu, lv)

        val metadata = FirebaseVisionImageMetadata.Builder()
            .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_YV12)
            .setWidth(width)
            .setHeight(height)
            .setRotation(rotation)
            .build()

        detector.detectInImage(FirebaseVisionImage.fromByteArray(dataYUV, metadata))
    }
    image.close()
}

其中,宽度、高度和旋转取决于相机/预览和/或图像阅读器设置。

票数 0
EN

Stack Overflow用户

发布于 2020-02-04 11:29:51

使用ImageReader.OnImageAvailableListener,您可以简单地将 FirebaseVisionImage#fromMediaImage(Image image, int rotation)用于ImageFormat YUV420_888

如文档中所示:

请注意,目前我们只支持

/ YUV_420_888格式。如果您使用的是云视觉检测器,则建议使用JPEG格式;如果您使用的是设备上的检测器,则YUV_420_888会更有效。

设置ImageReader

代码语言:javascript
运行
AI代码解释
复制
 mImageReader = ImageReader.newInstance(mVideoSize!!.width,
                mVideoSize!!.height,
                ImageFormat.YUV_420_888, 3)
        mImageReader!!.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler)

然后:

代码语言:javascript
运行
AI代码解释
复制
private val mOnImageAvailableListener = ImageReader.OnImageAvailableListener { imageReader ->
    val image = imageReader.acquireLatestImage()
    try {
        mFaceDetector!!
                .detectInImage(
                        FirebaseVisionImage
                                .fromMediaImage(image))
                .addOnSuccessListener { firebaseVisionFaces ->
                    if (firebaseVisionFaces.size > 0) {
                        Log.d(TAG, "onSuccess: FACE DETECTED")
                    }
                }
        image.close()
    } catch (e: NullPointerException) {
        Log.e(TAG, "onImageAvailable: Invalid image provided for detection", e)
    }
}

注意:我使用了人脸检测,条形码也可以以类似的方式使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53838413

复制
相关文章
如何自制条形码扫描器
在文章之前要先感谢我的老师黄小平先生,在制作这个扫描器期间,给了我们很大的帮助和指导. 先说下这个条形码扫描器的预期功能: 如名称所示,主要达到的功能就是实现给定一个条形码就能扫描出来并通过串口与电脑相联系,在电脑上显示条形码扫描器扫描出来的结果。和超市里面用的是不一样的,没那么高级.
仇诺伊
2018/09/12
2.1K2
如何自制条形码扫描器
awvs扫描器原理_条形码扫描器现在无法使用
AWVS AWVS(Web Vulnerability Scanner)是一个自动化的Web应用程序安全测试工具,它可以扫描任何可通过Web浏览器访问的和遵循HTTP/HTTPS规则的Web站点和Web应用程序。适用于任何中小型和大型企业的内联网、外延网和面向客户、雇员、厂商和其它人员的Web网站。WVS可以通过检查SQL注入攻击漏洞、XSS跨站脚本攻击漏洞等漏洞来审核Web应用程序的安全性。 AWVS功能介绍 WebScanner :核心功能,web安全漏洞扫描 (深度,宽度 ,限制20个) Site Crawler:站点爬行,遍历站点目录结构 Target Finder :主机发现,找出给定网段中开启了80和443端口的主机 Subdomian Scanner :子域名扫描器,利用DNS查询 Blind SQL Injector :盲注工具 Http Editor http:协议数据包编辑器 HTTP Sniffer : HTTP协议嗅探器 (fiddler,wireshark,bp) HTTP Fuzzer: 模糊测试工具 (bp) Authentication Tester :Web认证激活成功教程工具 基础知识: 白盒测试:结构测试,透明盒测试,在知道代码的情况下进行渗透,相当于代码审计 黑盒测试:在测试中,把程序看做一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况中,在程序接口进行测试扫描,什么都不知道 灰盒测试:介于白盒测试与黑盒测试之间的一种测试,在服务端设置代理agent 从客户端入手 (有权限去访问) AWVS如何工作 它会扫描整个网络,通过跟踪站点上的所有链接和robots.txt(如果有的话)而实现扫描。 然后AWVS就会映射出站点的结构并显示每个文件的细节信息。 在上述的发现阶段或者扫描过程之后,WVS就会自动地对所发现的每一个页面发动一系列的漏洞攻击,这实质上是模拟一个黑客的攻击过程。(自定义的脚本,去探测是否有漏洞) AWVS分析每一个页面中需要输入数据的地方,进而尝试所有的输入组合。这是一个自动扫描阶段 在它发现漏洞之后,WVS就会在“Alerts Node(警告节点)”中报告这些漏洞,每一个警告都包含着漏洞信息和如何修补漏洞的建议。 在一次扫描完成之后,它会将结果保存为文件以备日后分析以及与以前的扫描相比较,使用报告工具,就可以创建一个专业的报告来总结这次扫描。 审核漏洞 版本检查:包括易受攻击的Web服务器,易受攻击的Web服务器技术 CGI测试:包括检查Web服务器问题,主要是决定在服务器上是否启用了危险的HTTP方法。例如put 、trace,delete等等 参数操纵:主要包括跨站脚本攻击(XSS),SQL注入攻击,代码执行,目录遍历攻击,文件入侵,脚本源代码泄露,CRLF注入,PHP代码注入,XPath注入,LDAP注入,Cookie操纵,URL重定向,应用程序错误消息等。 多请求参数操纵:主要是Blind SQL/XPath注入攻击 文件检查:检查备份文件或目录,查找常见的文件(如日志文件,应用程序踪迹等),以及URL中的跨站脚本攻击,还要检查脚本错误等 Web应用程序:检查特定Web应用程序的已知漏洞的大型数据库,例如论坛,Web入口,CMS系统,电子商务应用程序和PHP库等 GHDB Google攻击数据库,可以检查数据库中1400多条GHDB搜索项目。 Web服务:主要是参数处理,其中包括SQL注入、Blind SOL注入(盲注),代码执行,XPath注入,应用程序错误消息等。 使用该软件的所提供的手动工具,还可以执行其他的漏洞测试,包括输入合法检查,验证攻击,缓冲区溢出等。 AWVS11页面介绍 AWVS从版本11开始,变成了网页端打开的形式,使用一个自定义的端口进行连接。
全栈程序员站长
2022/11/08
1.5K0
awvs扫描器原理_条形码扫描器现在无法使用
基于OpenGLES的Android相机预览
随着AR效果越来越普及,摄像头在Android中的应用越来越重要。通常摄像头的预览方案,通常使用SurfaceView的方案。
Oceanlong
2018/08/02
1.6K0
OpenGL ES for Android 相机预览
Android上打开摄像头需要camera权限,在Android 6.0及以上的版本需要动态申请权限,在`AndroidManifest.xml`中添加camera权限:
老孟Flutter
2020/09/11
1K0
使用 PreviewView 来展示相机预览
显示相机预览内容是每个相机类应用都会包含的功能,想要完美实现这个却并非易事。原因是,在某些特别极端情况下 camera2 API 的使用会变得很复杂,而且在不同设备上的行为还会有所不同。还好,Jetpack CameraX 库 的 PreviewView 可以帮助您解决这一问题。通过在各种 Android 设备上提供开发者友好、一致且稳定的 API,使得展示相机的预览变得不再困难。
Android 开发者
2020/11/15
1.8K0
使用 PreviewView 来展示相机预览
使用 PreviewView 来展示相机预览
显示相机预览内容是每个相机类应用都会包含的功能,想要完美实现这个却并非易事。原因是,在某些特别极端情况下 camera2 API 的使用会变得很复杂,而且在不同设备上的行为还会有所不同。还好,Jetpack CameraX 库的 PreviewView 可以帮助您解决这一问题。通过在各种 Android 设备上提供开发者友好、一致且稳定的 API,使得展示相机的预览变得不再困难。
Android 开发者
2020/06/19
2.9K0
使用 PreviewView 来展示相机预览
Vue中 实现文件流格式图片预览
URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的 URL。 这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
玖柒的小窝
2021/10/09
2.7K0
Vue中 实现文件流格式图片预览
[译] 同时使用多个相机流 — Android 相机介绍
这篇文章是当前关于 Android 相机介绍中最新的一篇,我们之前介绍过相机阵列和相机会话和请求。
Android 开发者
2019/03/14
2.6K0
[译] 同时使用多个相机流 — Android 相机介绍
NDK OpenGL ES 3.0 开发(十六):相机预览
相机开发是 OpenGL ES 开发的重要应用,利用 OpenGL 可以很方便地实现相机美颜、滤镜、塑型以及一些动态特效,其性能显著优于对应功能的 CPU 实现。
字节流动
2020/06/02
2.9K0
如何使用TextureView+OpenGL绘制相机预览
使用Camera2 API实现相机预览样板代码太多了,偷一波懒,CV大法发动。。。
雪月清
2020/06/23
2.9K0
基于OpenCV 的美颜相机推送直播流
先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的 每一帧图像是一个矩阵,opencv中的mat 数据结构。
流川疯
2019/01/18
1.6K0
最新版基于ZXing的Android扫码库
ZXingLite for Android 是ZXing的精简极速版,基于ZXing库优化扫码和生成二维码/条形码功能,扫码界面完全支持自定义,也可一行代码使用默认实现的扫码功能。总之你想要的都在这里。
xiangzhihong
2023/04/01
5.9K1
OpenGL ES for Android 相机预览适配不同分辨率的手机
上一篇讲到OpenGL ES for Android 相机预览,相机的预览分辨率设置为1280*720,大家有没有想过如果将GLSurfaceView设置为正方形会如何?很明显画面会被拉伸导致变形,在想一下如果设置GLSurfaceView为全屏,但目前市场上的手机有很多种不同的分辨率,尤其是全面屏、折叠屏屏,这些手机并不是常见的16:9的手机,因此我们需要适配这些不同分辨率的手机。
老孟Flutter
2020/09/11
1.6K0
Android使用SurfaceView作为相机预览识图时,视图被拉伸的问题
网上已经有很多人提到过,导致这种现象的原因是,传入的相机预览图像长宽比例,与SurfaceView本身大小长宽比例不一致。 那么解决方法也非常简单,只要获取一下设备本身支持的相机比例,然后选择其中一个与SurfaceView实际比例(经常就是设备的长宽)最相近的即可。 下面的代码是创建一个用于相机预览的SurfaceView的过程: //继承SurfaceView并且实现SurfaceHolder.Callback接口 public class CameraPreview extends SurfaceVi
NaOH
2018/05/29
4.1K0
条形码中的防护条如何设置
说到条形码防护条,大家应该在某些条形码上见过,比如UPC/EAN/JAN 符号体系就有。UPC/EAN/JAN标准包括某些条在条形码的主体下进行扩展的规格,这些条就是防护条,或者可以叫为警戒栏,是用来充当扫描设备的参考点的。其实这些防护条是可以调整的,下面小编就给大家介绍设置的方法。
神奇像素科技
2021/12/16
4980
条形码中的防护条如何设置
机器视觉中如何选择工业相机与合适的相机镜头
相机和镜头是计算机视觉中重要的组成部分,合适的相机和镜头决定了系统的好坏。但是大部分的计算机视觉工程师对如何选择工业用相机和合适的镜头上犯了难。本文主要介绍如何选择相机与对应的镜头。
不脱发的程序猿
2021/01/20
1.7K0
iOS_从相机或相册里扫描二维码或条形码
遵循 AVCaptureMetadataOutputObjectsDelegate 协议,实现扫描回调方法:
mikimo
2023/10/18
5320
说下three.js 中的相机
所有的3D编程中都有一个避免不了的话题就是相机,相机就是这样一个抽象,它定义了三维空间到二维屏幕的投影方式,用“照相机”这样一个类比,可以使我们直观地理解这一投影方式。而针对投影方式的不同,照相机又分为正交投影照相机与透视投影照相机。
程序你好
2021/07/23
1.6K0
说下three.js 中的相机
点击加载更多

相似问题

是否在相机捕获后立即在条形码扫描器中显示条形码值?

10

从条形码扫描器接收的数据流

19

使用USB扫描器和手机相机扫描器时,条形码扫描不同的值。

14

SurffaceView相机预览:查找不带拉伸的相机预览大小

21

离子ANDROID -条形码扫描器应用程序不要求相机许可

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档