一篇文章搞定专属代码的设计和开发
作者 | 木白
导读
本文将为您介绍百度码的译码技术,包括关键的译码流程和关键的优化手段。百度码目前已经在高考等活动中进行应用,在未来的发展中,百度码的译码技术将继续升级和完善,以满足更多场景的需求。百度码的译码技术将在现有的基础上不断演进和完善,以提供更为优质、便捷、安全的译码体验,从而为人们的生活和工作带来更多便利。
全文2797字,预计阅读时间7分钟。
01 大家熟悉的二维码
1.1 什么是二维码
二维码,起源于汽车制造业,是一种方形的矩阵型条形码。它以黑白像素点的不同排列方式来存储信息。与传统的一维条码相比,二维码可以存储更多的信息,并且占用的空间更小。
由于其高效、经济和易于扫描的特点,二维码被广泛用于各种领域,从产品标签到广告,再到电子票务和移动支付,其应用的范围日益扩大。目前已经在各个领域得到广泛的应用。
02 传统二维码应用中遇到的挑战
2.1 译码难度大
尽管二维码技术已经相当成熟,但在某些情况下,如内容过多、图像质量低下、损坏或因过度曝光、不理想的扫描角度、遮挡物等外部因素影响,都可能使译码过程遇到困难,导致内容不能正常分发。
2.2 美观与译码成功率的矛盾
传统二维码没有预留品牌与美观等设计,以QRCode为例,对其的美化方式通常有,在二维码的中心添加Logo,对内容点进行圆化,或者将二维码耦合在图像中。这种方式往往是以牺牲了二维码自身的纠错冗余为代价的。使得译码难度变得更加大。
2.3 具有安全隐患
另一个问题是安全隐患。因为传统二维码的生成逻辑是开放的,恶意行为者开始利用其将病毒、恶意代码或跟踪器植入 用户的设备中。或者通过二维码来传播谣言、敏感信息,此外伪造或篡改的二维码也可能对用户产生误导、导致信息泄露等等。
03 专属二维码
3.1 为什么需要专属二维码
译码是将二维码用于信息分发、活动倒流中十分重要的环节,译码的成功与否,直接影响了活动本身的分发结果。首先需要理解其背后的设计逻辑和原则。正如前文所言,传统的QR码已经在全球范围内得到了广泛的应用,但随着技术和业务的发展,在各方面都提出了新的要求和挑战,美观性、安全行、高效性均有新的要求。百度专属二维码正是为了解决这些新需求而设计的。
3.2 专属二维码的设计诉求
1、美观性:百度专属码的设计上留置Logo空间,更加容易的结合代表企业品牌形象的设计语言,扩大品牌影响力,圆形的设计更具美感;
2、抗损坏:百度专属码的关键数据区域与有效信息区域均具备纠错能力,且部分关键区域进行多次冗余设计;
3、安全性:独有的专属码生成和解析协议,有效控制专有码生成渠道,防止通过二维码来传播黄反暴恐等信息;
4、容量可调整:百度专属码设计具备动态扩容机制,以适应不同信息容量需要。
04 百度专属二维码译码实现和优化
译码流程主要可以细分为以下几个关键步骤:首先进行关键定位点的识别,然后是元信息的提取和解析,接着是进行协议的解析,紧接着是数据信息的解读,最后完成bit信息的解码。因为保密的原因,这里仅针对技术方向进行解析。
4.1 核心译码流程
4.2 定位点的确定
二维码的关键定位点发现,通常可以通过图像处理技术实现,例如使用边缘检测来找到二维码的边缘,再结合霍夫变换确定四个角和中心位置。考虑到不同的光线条件,自适应阈值技术可以提高定位的准确性,专属码中采用了识别特定模式的方式,并且结合了多种容错方式召回非标准码;在定位点位置确定之后,可以以此建立二维码坐标系。进而进行后续的解码过程。
4.3 元信息的解析
元信息存储在二维码的特定预定位置。通过定位点的确定,构建码的坐标系。进而获取到专属码的元信息。当图像出现畸变或损坏的情况下,就需要容错机制来辅助修复或跳过某些部分, 专属码在这个过程中主要采用了冗余以及纠错码的引入。
4.4 协议解析
协议解析也是非常关键的步骤。这一步是为了识别二维码的格式和编码规则。可以通过预定义的协议库来帮助匹配和解析。当然,为了适应更多的格式,这部分被定义为可拓展,通过更新协议可以解析更多的码。
4.5 bit信息解码
对bit信息进行解码。这一步涉及到数据的二进制形式。基本的逻辑运算是主要工具,但为了提高解码的准确性,特别是在有噪声或误差的情况下,会加入一些纠错技术,例如Hamming码、Reed-Solomon码等等;经过相应的纠错算法还原之后,就可以通过协议中预设的字符集将bit信息转换成最终的字符串了。
4.6 译码优化
除了上述的主要译码流程,为了提高译码效率和准确性,我们采用了一些优化策略。
4.7 译码性能优化
经过深入分析专属码的译码耗时主要分布在逐圈信息读取以及对定位点的筛选重试过程中。
1、并行读取
在专属码的解析过程中,因为存在多圈信息解析,逐圈读取信息是一个相对耗时的过程,此处可以利用并行计算来加速读取过程。让多圈的读取过程分布在多个核心运行,提升译码效率。
2、快速校验
为了快速确定二维码的有效性,可以在定位点确定之后,建立坐标系之后,立即进行校验,从而避免不必要的完整解码过程。极大提升了干扰严重情况下的译码效率。
4.8 光暗扫码优化
根据图像的质量和外部环境(如光线、摄像头质量等),动态选择或调整最合适的图像处理算法和参数。对于在低光环境下拍摄的二维码,选择更为敏感的边缘检测算法。对于过曝光的二维码,处理过程中会进行相应的抑制, 尽可能提升解析的分辨能力。
4.9 纠错技术应用
通过合理选择和组合不同的纠错技术(如Hamming码、Reed-Solomon码),可以在确保解码准确性的同时,尽量减少额外的计算量。百度专属码在生成过程中会进行判定,选择最佳的纠错方式。使得纠错能力最大化。
4.10 机器学习与深度学习应用
随着机器学习和深度学习技术的发展,这些技术可以被用来优化和提高译码过程的准确性和效率。例如,训练一个深度神经网络来识别和纠正扭曲或部分损坏的二维码。百度码中的译码过程中应用了深度学习技术去辅助确定专有码的位置。
05 总结
本文介绍了在译码视角中解析了百度码的译码技术,包括关键的译码流程,以及关键的优化手段。百度码目前已经在高考等活动中进行应用。
在未来的发展中,百度码的译码技术将继续升级和完善,以满足更多场景的需求。百度码的译码技术将在现有的基础上不断演进和完善,以提供更为优质、便捷、安全的译码体验,从而为人们的生活和工作带来更多便利。
——END——
推荐阅读:
AI原生应用速通指南
代码理解技术应用实践介绍
百度交易中台之内容分润结算系统架构浅析
小程序编译器性能优化之路
百度APP iOS端包体积50M优化实践(六)无用方法清理
上一篇: Gitee 企业版和个人版有哪些区别?
推荐阅读
-
一篇文章搞定专属代码的设计和开发
-
35 岁实现财务*,腾讯程序员手握2300万提前退休?-1000万房产、1000万腾讯股票、加上300万的现金,一共2300万的财产。有网友算了一笔账,假设1000万的房产用于自住,剩下1300万资产按照平均税后20-50万不等进行计算,大约花上26-60年左右的时间才能赚到这笔钱。也就是说,普通人可能奋斗一辈子,才能赚到这笔钱。在很多人还在为中年危机而惶惶不可终日的时候,有的人的35岁,就已经安全着陆,试问哪个打工人不羡慕?但问题是有这样财富积累必然有像样的实力做靠山。没有人可以不劳而获。 看到这里,肯定有人说,那么对于普通人来说,卷可能真就成了唯一的出路。但是卷也有轻松的卷,“偷懒”的卷法,对于程序员而言,刨除掉一时无法改掉的开会传统占用的大部分时间,如何把有限的时间和精力放在真正重要的架构设计、需求设计上,而不是重复的造*,编码、改bug、手动测试。因此在科技改变生活的今天,学会使用AI工具成为程序员们的必备技能。 以全栈式全自动的软件开发工具飞算SoFlu软件机器人为例,作为全球首款面向微服务架构设计和最佳实践的软件机器人,SoFlu软件机器人改变了原来手工编码的作业模式,通过可视化拖拽方式以及参数配置就能实现等同于编写复杂代码的业务逻辑,在设计业务逻辑时就完成了微服务应用开发,做到“业务即图,图即代码”,实现“软件开发,十倍提效”。 而作为飞算SoFlu软件机器人的一个重要组成部分,FuncGPT(慧函数)支持所有类型函数创建。通过自然语言描述Java函数需求,实时生成高质量、高可读性的Java函数代码。生成代码可直接复制到IDEA,或一键导入Java全自动开发工具函数库。 FuncGPT(慧函数)具有五大核心能力: ● 自然语言:通过自然语言即可生成函数,降低软件开发门槛。 ● 秒级函数开发:全自动秒级开发函数,秒级完成,效率千倍提升。 ● 一站式函数开发应用:函数生成即可直接应用,效率、安全有保障。 ● 质量可靠:生成的函数代码符合业界规范、具备良好的可读性,符合最优解。 ● 灵活生成:可以根据开发人员的具体需求生成并支持调整和修改。 以“将文件流转换为File对象”这个需求为例,以下是FuncGPT(慧函数)秒级生成的代码: / 类名:FileConverter // 函数名:convertStreamToFile // 函数功能:将文件流转换为File对象 // POM依赖包:无 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class FileConverter { /** * 将文件流转换为File对象 * @param inputStream 文件流 * @param filePath 文件路径 * @param fileName 文件名 * @return 转换后的File对象 * @throws IOException 如果发生I/O异常 */ public static File convertStreamToFile(InputStream inputStream, String filePath, String fileName) throws IOException { File file = new File(filePath + File.separator + fileName); // 创建File对象 try (FileOutputStream outputStream = new FileOutputStream(file)) { // 创建文件输出流 byte buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 从文件流读取数据并写入文件 outputStream.write(buffer, 0, bytesRead); } } return file; // 返回转换后的File对象 } } // 函数示例 // 将文件流转换为File对象示例 // 入参:inputStream,文件流 // 入参:filePath,文件路径 // 入参:fileName,文件名 // 出参:file,转换后的File对象 // 调用示例: // InputStream inputStream = new FileInputStream("example.txt"); // String filePath = "C:\\Users\\User\\Documents"; // String fileName = "example.txt"; // File file = FileConverter.convertStreamToFile(inputStream, filePath, fileName); // System.out.println(file.getAbsolutePath); // 输出结果:例如,将文件流转换为File对象后,文件的绝对路径为:C:\Users\User\Documents\example.txt // 则输出结果为:C:\Users\User\Documents\example.txt 通过分析,不难发现以上代码:
-
像首席技术官一样思考:如何高效管理 30 人的研发团队?-管理越多越轻松。好的研发团队,应该是上拨下用,即下级对上级的向上管理;而不是反过来,总是向下管理,甚至是 CTO 做经理的事,经理做工程师的事,工程师最终会被当成实习生。如果是这样,就会越管越累,不仅团队无法成长,而且团队整天很忙还效率低下,问题一大堆。 有这样一个小故事:一位高级经理下班后帮忙倒垃圾,结果被老板训斥了一顿。这就好比首席技术官做了实习生自己该做的事。事情本身没有对错之分,只是从不同的角度有不同的理解。 古人云:"用人不疑,疑人不用"。在面对自己的研发团队时,应该相信他们能做好,授权一线开发人员充分发挥专业特长,不要限制他们的工作。但在相信他们的同时,也要进行二次确认,始终秉持 "我相信,但我要确认 "的原则和严谨的精神。因为每个人都会犯错和疏忽,通过发挥团队的智慧,团队犯错的机会就会大大减少。比如回归测试、代码审查、开发演示、变更审批等等。 如前所述,每个人都难免会犯错。但作为管理者,你所设计和商定的流程不能出错。管理者的每一个决定和沟通都应该经过深思熟虑。就像红绿灯的交通设计,某辆车不小心闯红灯可能会扣分,但红绿灯的设计一定要正确、人性化、统一。再比如,开发人员可能会因为疏忽大意写出 bug,但研发流程的设计和上线流程的发布不能有任何差错。因此,流程体系的设计,一方面要结合当前团队规模、业务特点和需要重点解决的问题来设计,另一方面也要在人员防错、效率提升、发挥团队集体智慧等维度进行综合考量。应该站在更高更抽象的角度去思考,不断思考一个倍受欢迎的园区应该如何设计,思考一个灵动、经典、永恒的建筑应该遵循怎样的模式,思考一个成功、优秀、卓越的研发团队应该需要怎样的流程和制度。 最后,反馈很重要。向上汇报很重要,向下反馈也很重要。能够保持顺畅的双向反馈和闭环管理,对研发团队的协作和沟通有着非常明显的积极作用。在向上汇报方面,要培养团队在正式汇报、会议汇报、私下沟通、书面总结、非正式场合等方面的沟通能力,提醒下属报喜也要报忧。凡事先记录,再跟进,最后反馈。反馈很重要,主动汇报更难得。 另一方面,同时也不要忽视向下反馈。好的爱,是双向的。团队也是如此,没有严格的上下级之分,只是分工和角色不同而已。作为管理者,不必总保持一种 "神秘感",让人 "捉摸不透 "才是牛。当团队做得好或有人做得好时,要记得在公开或私下场合给予肯定和赞许。业务有增长、业绩有提升时,别忘了给团队一些鼓励,或者安排一次下午茶或聚餐。在例会或正式会议上,也可以同步向大家传达一些重要信息和高层指示。"欲速则不达,欲远则同行"。 当向上汇报、向下反馈的沟通闭环形成后,同时结合前面研发过程的管理闭环,双管齐下,就能形成良性循环。如此反复,持之以恒,优秀卓越的研发团队,必将呈现。 能力、产出和效率 接下来,继续重复关于能力、产出和效率的话题。 站在不同的角色,以及一个企业经营、生存和发展所需要的基础上,我把研发生产力分为三个层次,分别是:一线员工关心的研发能力、管理层关心的软件产出和操作人员关心的企业生产效率。简单概括就是:既要把工作做好,又要能出成果,还要能帮企业赚钱。
-
有一篇文章详细解释了 Go 的 25 个关键字的含义、用途和代码示例--关于公开访问的说明,请访问以下链接
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。
-
一篇深入浅出的文章,介绍运行和维护开发的必备技能--HTML 表单。基础不牢,地动山摇。跟上节奏,复习巩固前端基础。
-
趣谈留言队列,搞清楚留言队列到底是什么!-说到消息队列,洪觉大概能猜到人们听到消息队列的反应,大致可以分为以下几类人。 第一类人,懵懵懂懂,刚上大学接触编程,还没用过消息队列,甚至还以为消息队列就是代码里面要新建一个List之类的;第二类人,听过消息队列,了解消息队列,但具体是什么还不是太明白,只知道一说到消息队列,脑海里马上出现了三组词,削峰、异步、解耦;第三类人,用过消息队列,对它有一定了解,但不知道为什么要这样设计,消息队列有什么样的前世今生,是如何演化到现在的模式的?**第四类人,已经对消息队列有了足够的了解,可以阅读本帖作为复习和温习。**你属于哪一类?无论你对消息队列了解多少,读完这篇文章后,我相信你都会有所收获。 什么是消息队列?我们为什么要使用消息队列?真的只是因为它看起来很勉强、很常用吗?当然不是,一项技术的出现往往是为了解决某种痛点,我们就从这个痛点出发,看看消息队列到底是为了解决什么问题而诞生的。 相信大家在工作之前,或者工作中接触单片机的次数会多一点,不管什么业务都一股脑塞进一个系统里,这种情况下接触消息队列的场景会比较少。但随着业务的增长,量上去了,单机系统就很难维护了,也扛不住并发量的增长,就需要把原来的单体应用拆分成多个服务。例如,牛奇网采用分布式架构,将原来的单体系统拆分成用户服务、题库服务、求职服务、论坛服务等,每个分布式节点都有一个集群,保证高可用性。 那虽然在这样的微服务架构下,如果某个核心业务并发量过大,系统就扛不住了。比如淘宝、淘票票、拼多多、京东等电商场景中的支付场景,你在某宝下单并支付后,调用支付服务,完成支付后,还需要更新订单的状态,这个时候就需要调用订单服务,那我们平时也下单,除了简单完成这些操作外,还会给你相应的积分;商家也会收到订单消息,并给您发送旺旺消息,确认订单无误;同时,也会给您发送消息,确认订单无误。确认订单无误;同时您还可以查看您的物流状态;还有系统为了给您推荐更适合您的商品,会根据您的订单做类似的推荐等等,我说的这些都是当我们下单后,肉眼可以感知到系统所做的动作。 **一个支付动作如果还需要调用那么多服务,等他们响应成功,最后再告诉用户你支付成功了,用户在系统中的整个体验会非常糟糕。**设想一下,假设请求服务+处理请求+响应总共需要 50ms,我们上面列出的场景:支付服务、订单服务、积分服务、商家服务、物流服务、推荐服务,总共需要 300ms。
-
搞定vite、vue3.0和ts的axios封装,一篇文章轻松解决!
-
使用JAVA和SSM开发在线报名系统的详细设计与实现,附带源代码
-
使用JAVA和SSM开发智能旅行路线规划系统的设计与实现(附带源代码)