|
【HarmonyOS HiSpark AI Camera试用连载 】AICamera之百度识图(一), 我本来闭关准备把程序全部写好了再一起发文,突然发现距上次发帖已经十多天了,不得已,把内容拆开来混篇数。 百度识图原理其实很简单,就是调用百度API 来对你上传的一张图片进行识别,具体可以做到:把图片里面的人物标示出来(抠图)、定位人脸(聚焦)、识别物体……,总之就是很好很强大。 调用百度API 分为两个部分:根据你提前申请的“ API_KEY ”和“ SECRECT_KEY ”生成一个 token ,再利用这个 token 来调用 API 。因此我们把百度识图功能点分为: 1、 图片格式识别 2、 把图片转成BASE64 格式,可利用文本方式传输 3、 实现http/https 网站 get 功能 4、 返回信息处理 我们知道上述功能在linux 下,几乎是不需要花费什么脑子就能实现的,因为需要的库都可以直接调用,但在鸿蒙系统下, 我试图编译“ code-1.0/third_party/openssl ”和“ code-1.0/third_party/curl ”生成我所需要的库,但一直没能成功,希望直接通过调用其源文件,也一直没能成功。所以卡在上述第三步已经很长时间了,先把前两个步骤说一下吧: 一、 图片格式识别 在百度AI 中,可以识别的图片主要有 bmp 、 jpg 、 png ,因此我们在进行识别之前,需要将待识别的图片转换为上述格式,可以考虑使用特定硬件,所以图片输出格式其实是可控的,最简单当然是 BMP 格式,但 BMP ( Bitmap )采用位映射存储格式,不采用压缩,文件所占用的空间很大,传输占用资源也较多;另外 PNG 和 JPEG 格式也用的非常多,这两种格式都是压缩后的, PNG ( Portable Network Graphics )是一种无损压缩的位图片形格式,它使用从 LZ77 派生的无损数据压缩算法,文件体积小,而且它支持 alpha 通道,可以设置图片透明度; JPEG ( Joint Photographic Experts Group ) 采用 不带透明通道的0-10 级压缩图片格式( 11 级压缩) ,可选择压缩比,通过损失图像质量来获得更小的体积,在网络中用得最为广泛。 在使用时,如果只是简单看后缀名,是不太够的,如何识别图片格式呢?其实非常简单,直接读取文件开始的前个字节,比如bmp 格式: bmp 文件头( 14 字节) + 位图信息头( 40 字节) + 调色板 + 位图数据,用编辑器打开一张 BMP 图片:
图片1.png (4.72 KB, 下载次数: 0)
下载附件 保存到相册
昨天 00:48 上传 文件头占14 个字节 1) 前 2 bytes(0,1) 是’ BM ’ (windows), ’ BA ’ (os/2 bitmap array), ’ CI ’ (os/2 color icon), ‘ CP ’ (os/2 color pointer), ‘ IC ’ (os/2 icon), ‘ PT ’ (os/2 pointer) 如此处是:42 4D ,即 ASCII 码的 BM 2) 接下来4 个字节 (2-5) 说明该位图文件的大小,用字节表示。这里的 48 E5 0E (高位在后)就是 976,200 。
图片2.png (1.45 KB, 下载次数: 0)
下载附件 保存到相册
昨天 00:49 上传 3) 接下来就是 2 个保留位,各占 2 个字节,一共 4 个字节设置为 0 。 4) 接下来 4 个字节是:文件头开始到实际图像数据之间的字节偏移量。 图片大小(宽* 高)在 10h~13h 和 14h~17h 处,即 00 00 92 02 和 00 00 EE 01 ,如下图
图片3.png (2.49 KB, 下载次数: 0)
下载附件 保存到相册
昨天 00:49 上传 0x292H=658D , 0x1EEH=494D 又如PNG 格式
图片4.png (14.79 KB, 下载次数: 0)
下载附件 保存到相册
昨天 00:49 上传 前8 字节的 PNG 文件署名域 + 数据块,署名域保持不变,从 01 字节开始 ASCII 就是 PNG。图片的宽 * 高与 BMP 图片所在位置相同,即 00 00 02 34 和 00 00 02 BF (高位在前,低位在后)
图片5.png (2.58 KB, 下载次数: 0)
下载附件 保存到相册
昨天 00:49 上传 0x234H=564D , 0x2BF=703D JPEG 图片格式组成部分: SOI (文件头) +APP0 (图像识别信息) + DQT (定义量化表) + SOF0 (图像基本信息) + DHT (定义 Huffman 表) + DRI (定义重新开始间隔) + SOS (扫描行开始) + EOI (文件尾)
图片6.png (13.05 KB, 下载次数: 0)
下载附件 保存到相册
昨天 00:49 上传 其中文件头部分FFD8 就定义了文件格式。 综上,我们只需要打开文件时,读取前几个字节,就能识别出文件的格式。 |
|