当前位置:   article > 正文

二维码检测定位_二维码定位的原理

二维码定位的原理

条码

条码分为一维条码、二维条码和三维条码。
在这里插入图片描述

  • 一维条码(Bar Code)
    一维条码是由一组粗细不同、黑白(或彩色)相间的条、空及其相应的字符(数字字母)组成的标记,即传统条码。是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。
    在这里插入图片描述

  • 二维条码(QR Code,Quick Response Code)
    二维条码简称为二维码,是用某站特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形。常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
    在这里插入图片描述

  • 三维条码
    三维条码具有更大的信息容量、相同的识别便易性和较好的安全性。三维码的主要特征在于利用色彩或灰度(或称黑密度)表示不同的数据并进行编码。

二维码

二维码的分类

二维条码有许多不同的码制,就码制的编码而言,通常分为三种类型:

  • 线性堆叠式二维码
    建立在一维条码基础上,按需要堆积成两行或多行。
    在这里插入图片描述

  • 矩阵式二维码
    在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”。
    在这里插入图片描述

  • 邮政码
    邮政码通过不同长度的条进行编码,主要用于邮件编码,如POSTNET、BPO4-STATE。

二维码的优缺点

  • 优点
    • 高密度编码,信息容量大
    • 编码范围广
    • 容错能力强
    • 译码可靠性高
    • 可引入加密措施
    • 成本低,易制作,持久耐用
  • 缺点
    • 二维码技术称为手机病毒、钓鱼网站传播的新渠道
    • 信息泄露

二维码的国际标准

目前流形三大国际标准:

  • PDF417:不支持中文
  • DM:专利未公开,需要支付专利费用
  • QR code:专利公开,支持中文

QR code与其他二维码相比,具有识读速度快,数据密度大,占用空间小的优势。

二维码符号结构

QR码呈正方形,常见的是黑白两色。在3个角落,印有较小,像“回”字的正方图案。这3个是帮助解码软件定位的图案,用户不需要对准,无论以任何角度扫描,资料仍然可以正确被读取。日本QR码的标准JIS X 0510在1999年1月发布,而其对应的ISO国际标准ISO/IEC18004,则在2000年6月获得批准。根据Denso Wave公司的网站资料,QR码是属于开放式的标准,QR码的规格公开,虽由Denso Wave公司持有的专利权益,但不会被运行。除了标准的QR码之外,也存在一种称为“微型QR码”的格式,是QR码标准的缩小版本,主要是为了无法处理较大型扫描的应用而设计。微型QR码同样有多种标准,最高可存储35个字符。

QR码最大特征为其左上,右上,左下三个大型的如同“回”字的黑白间同心方图案,为QR码识别定位标记,失去其中一个会影响识别。而呈棋盘般分布的有别与大定位标记的较小的同心方则为其校正标记,用于校正识别,版本1没有校正标记,版本2在右下方,其中心点在左下和右上定位标记的外边框的相交点,版本10开始以每个等距的方式出现在右下校正点至左下和右上定位标记的外边框的连线、左上与左下定位标记的外边框的连线、左上与右上定位标记的外边框的连线之间、这四边线上等距点对边相连线,版本10等距有1个,版本25为3个,版本40为5个。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 位置探测图形、位置探测图形分隔符:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;这些黑白间隔的矩形块很容易进行图像处理的检测。

  • 校正图形:根据尺寸的不同,矫正图形的个数也不同。矫正图形主要用于QR码形状的矫正,尤其是当QR码印刷在不平坦的面上,或者拍照时候发生畸变等。

  • 定位图形:这些小的黑白相间的格子就好像坐标轴,在二维码上定义了网格。

  • 格式信息:表示该二维码的纠错级别,分为L、M、Q、H;

  • 数据区域:使用黑白的二进制网格编码内容。8个格子可以编码一个字节。

  • 版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。

  • 纠错码字:用于修正二维码损坏带来的错误。

QR 码

QR码(英语:Quick Response Code;全称为快速响应矩阵图码)是二维码的一种,于1994年由日本DENSO WAVE公司发明。QR来自英文Quick Response的缩写,即快速反应,因为发明者希望QR码可以快速解码其内容。QR码使用四种标准化编码模式(数字、字母数字、字节(二进制)和日文(Shift_JIS))来存储数据。QR码常见于日本,为目前日本最通用的二维空间条码,在世界各国广泛运用于手机读码操作。QR码比普通一维条码具有快速读取和更大的存储资料容量,也无需要像一维条码般在扫描时需要直线对准扫描仪。因此其应用范围已经扩展到包括产品跟踪,物品识别,文档管理,库存营销等方面。

在这里插入图片描述

QR码的种类

在这里插入图片描述

QR码模型1模型2

QR码模型1是最早制作的QR码,最高版本为14(73x73码元),最多处理1167位数字。QR码的模型2是在模型1的改良版,它在二维码变形的情况下也能顺利读取数据。当二维码被打印在曲面上,或者由于读取角度等原因导致二维码变形时,仍然可以通过设置在二维码内部的对齐模式有效读取。最高版本为40(177x177码元),最多可以处理7089位数字。

Micro QR码

Micro QR码只有一个定位图案,由于普通的QR码在3个角落上设置了定位图案,因此必须保证一定的尺寸。普通的QR码的边缘还必须留出至少4码元的空白,但Micro QR码的边缘只需要留出2码元的空白就足够了。Micro QR码可以在比QR码更小的空间内打印。
在这里插入图片描述

  • 数据容量和二维码的尺寸
    Micro QR码能存储的数据量不是很大。(最多可以存储35个数字)与QR码相比,数据存储效率更高,因此即使数量增加,二维码也不会变大。Micro QR码分为M1~M4等4个版本。即使是最高版本M4也比QR吗版本1的可存储数据量少。
    在这里插入图片描述
    Micro QR码的各个版本和最多可存储字数一览表。
    在这里插入图片描述
    QR码版本1的数据量。
    在这里插入图片描述
  • Micro QR码的标准化
    与普通QR码一样,Micro QR码已经公开规格,并且DENSO WAVE INCORPORATED已宣布,不行使本公司就Micro QR码拥有的专利权力(JP2938338)。
    在这里插入图片描述

iQR码

iQR码是可以简单读取二维码位置和大小的矩阵式二维码。使用iQR码,就能够生成出更为广泛的二维码,比如与普通的QR码以及Micro QR码相比尺寸更小的二维码,也可生成存储数据量更多的大型二维码等。此外,还可以制成长方形,支持内外翻转、黑白反色、圆点图案(直接打标在部件上),应用范围极其广泛。
在这里插入图片描述

iQR码的优点
  • 信息的高密度化
    iQR码与传统的QR码相比可以存储更大的信息量。如果是与传统QR吗相同尺寸,iQR码可以存储80%的信息量,如果要存储相同信息量,与传统QR码相比,尺寸可以缩小30%。
  • 尺寸小型化
    iQR码可以生成比传统QR码更小的二维码,传统QR码的最小码元结构为纵向11码元x横向11码元,与此相比,iQR码最小的码元构成为纵向9码元x横向9码元,二维码的棉结缩小到传统QR码的60%左右。
    在这里插入图片描述

  • 长方形化
    iQR码不仅可以生成正方形,还可以生成长方形。这样可以将打印条码的空间替换为iQR码,也可以打印在很难读取正方形码的圆筒状产品上。
    在这里插入图片描述

  • 大容量化
    iQR码可以生成最大存储量比传统QR码更多的二维码。传统的QR码的最高版本(码元数为纵向177x横向177)能存储的数据量约为7000个字符,而iQR码的最高版本(码元数为纵向422x横向422)约可以存储40000个字符。(存储数据为数字)
    在这里插入图片描述

  • 高恢复率
    iQR码具备了比传统QR码更高的二维码恢复功能。在二维码破损、脏污等的数据纠错级别方面,传统QR码最高可以纠正整体的30%,而iQR码的纠错功能高达50%。
    在这里插入图片描述

iQR码的规格

在这里插入图片描述

iQR码的数据容量

iQR码有多种多样的码元结构。

  • 正方形二维码的情况
    采用正方形时,最小尺寸纵向9码元x横向9码元可以存储6位数字,最大尺寸纵向422码元x横向422码元则大约可以存储40000个字符。
    在这里插入图片描述

  • 长方形二维码的情况
    采用长方形时,最小尺寸横向5码元×纵向19码元可以存储6位数字,最大尺寸横向43码元×纵向131码元则大约可存储1200个字符。
    在这里插入图片描述

QR码的优点

  • 存储大量信息
    传统的条形码只能处理20位左右的信息量,与此相比,QR码可以处理条形码的几十倍到几百倍的信息量。另外,QR码还可以支持所有类型的数据。如:数字、英文字母、日文字母、汉字、符号、二进制、控制码等。一个QR码最多可以处理7089字(仅用数字时)的巨大信息量。存储300位的英文字母和数组时,转换为QR码后只有这么小。
    在这里插入图片描述

  • 在小空间内打印
    QR 码使用纵向和横向两个方向处理数据,如果是相同的信息量,QR码所占空间为条形码的十分之一左右。还支持Micro QR码,可以在更小空间内处理数据。
    在这里插入图片描述

  • 可以有效地处理各种文字
    QR码是日本国产的二维码,因此非常适合处理日文字母和汉字。QR码字集规格定义是按照日本标准“JIS第一级和第二级的汉字”制定的,因此在日语处理方面,每一个全角字母和汉字都用13比特的数据处理,效率较高,与其他二维码相比,可以存储20%以上的信息。
    在这里插入图片描述

  • 对变脏和破损的适应能力强
    QR码具备“纠错功能”,即使部分编码变脏或破损,也可以恢复数据。数据恢复以码字为单位(在QR码的情况下,每8比特代表1码字),最多可以纠错约30%,根据变脏和破损程度的不同,也存在无法恢复的情况。
    在这里插入图片描述

  • 可以从360°任一方向读取
    QR码从360°任一方向均可以快速读取,其3处定位图案,可以帮助QR码不受背景样的影响,实现快速稳定的读取。
    在这里插入图片描述

  • 支持数据合并功能
    QR码可以将数据分割为多个编码,最多支持16个QR码。使用该功能可以在狭长区域内打印QR码。另外,也可以把多个分割编码合并为单个数据。
    在这里插入图片描述

在这里插入图片描述

QR码的信息量和版本

QR码设有1到40的不同版本(种类),每个版本都具备固有的码元结构(码元数)。码元是指构成QR码的方形黑白点。

码元结构是指二维码中的码元数。从版本1(21码元x21码元)开始,在纵向和横向各自以4码元为单位递增,一直到版本40(177码元x177码元)。
在这里插入图片描述
QR码的各个版本结合数据量、字符类型和纠错级别,均设有相对应的最多输入字符数。即如果增加数据量,则需要使用更多的码元来组成QR码,QR码就会变得更大。

如果需要输入的数据为100位的数字时,通过以下步骤来选定。

  • 假设要输入的数据种类为“数字”
  • 从“L”“M”“Q”“H”中选择纠错级别(假设选择“M”)。
  • 查看下标,先从数字列找到数字为100以上且接近100的,其次找出纠错级别“M”,两者交叉的部分就是最佳版本。
    在这里插入图片描述
  • 在此例中,最佳版本就是版本3(码元数29x29)。

纠错功能

QR码具有“纠错功能”。即使编码变脏或破损,也可以自动恢复数据。该“纠错能力”局部4个级别,用户可以根据使用环境选择相应的级别。调高级别,纠错能力也相应提高,但由于数据量会随之增加,编码尺寸也会变大。应综合考虑使用环境、编码尺寸等因素后选择相应的级别。在工厂等容易沾染脏污的环境下,可以选择级别Q或H,在不那么脏的环境下,且数量较多的时候,也可以选择级别L。一般情况下大多选择级别M(15%)。
在这里插入图片描述
纠错功能的机制 纠错级别的比率,是指全部码字与可以纠错的码字的比率。例如,需要编码的码字数据有100个,并且想对其中的一半,即50个码字进行纠错,计算方法如下。纠错需要相当于码字2倍的符号(RS编码,QR码的纠错功能是通过将QR编码附加到原数据中的方式实现的。RS编码是应用于音乐CD等用途的数字纠错方法。它能以字节为单位进行纠错,适合用于错误位置会集中的突发错误。),因此在这种情况下的数量为50个x2=100码字。因此全部码字数量为200个,其中用作纠错的码字为50个,所以计算得出,相对于全部码字的纠错率就是25%。这一比率相当于QR码纠错级别中的“Q”级别。

另外,在上述例子中,也可以认为相对于码字数据的纠错率Wie50%,但变脏或破损的部位不仅仅局限于码字数据部分,因此,在QR码中,还是用相对于全部码字的比率来描述纠错率。

QR 码的标准化

  • QR码的标准化历程
    在这里插入图片描述
  • QR码的简要标准
    在这里插入图片描述

QR码的制作和读取

QR码系统可以分为两道工序,即QR码的制作和读取。QR码的制作是用“燃机和打印机”来实现,读取时使用“扫描仪和应用程序”。
在这里插入图片描述

生成QR码

生成QR码时的要点

在这里插入图片描述

  • 码元大小的设定要点
    在确定QR码版本后,还要确定以码元(构成QR码的一个方形图块)要以多少mm打印,码元大小不同,QR码的实际尺寸也会有所不同。
    码元越大,QR码扫描仪就越容易读取。
    码元大小应综合考虑用途之后确定,我们建议用户在打印范围内尽可能大地打印。在这里插入图片描述
    在这里插入图片描述

    • 打印机的打印头密度和码元大小的设定
      在这里插入图片描述

    • 扫描仪可读取的码元大小
      在这里插入图片描述

  • 确定二维码范围时的要点

    • 留出边缘(空白)
      版本和码元大小确定以后,QR码本身的大小也就确定了。为进行实际运用,请在二维码的边缘还留出足够的空白。边缘空白是指在标记四周的不包含任何内容的范围。必须在上下左右四个方向分别留出4码元宽度以上的空白。
      在这里插入图片描述

    • 求二维码范围的计算示例
      求出包括边缘在内的二维码最终范围的例子。将50位英文字母与数字转换为QR码的情况,二维码范围需要每边9.398mm的正方形空间。
      在这里插入图片描述

    • 当二维码范围过大时
      当通过上述过程求得的QR码范围无法放入希望打印的空间内时,请考虑以下3点解决方案。
      在这里插入图片描述

  • 无法读取的情况举例
    QR码在二维码的显示清晰且符合标准的情况下方可保证稳定读取。若QR码不符合标准或不清晰,有可能某种扫描仪或手机无法读取。
    另外,不符合标准的二维码不能被称为QR码。

    • 码元变形
      用图像处理工具等对QR码进行放大或缩小,会导致各个码元的变形。
      虽然外观上与普通的QR码一样,但实际上却很难读取,甚至有时无法读取。
      在这里插入图片描述

    • 边缘印有文字或图案
      若在QR码的边缘印上文字或图像,则无法留出足够的边缘空白。这样的二维码很难读取,甚至有时无法读取。
      在这里插入图片描述

    • 文字、图像等标记摆在二维码上
      若在和QR码重叠的位置上印上文字或图像等标记,则明暗对比将变得模糊。这样的二维码很难读取,甚至有时无法读取。
      在这里插入图片描述

QR码生成软件

在这里插入图片描述

读取QR码

读取设备介绍
  • 便携式扫描仪
    手持读取二维码的扫描仪。
    读取的数据可以通过数据线或无线方式传输到电脑中进行处理。
    设备机型丰富多彩,例如有小型机型、轻质机型以及提高结构坚固性的机型等,还可以根据读取距离、分辨率等性能不同,或根据用途和使用场合不同选择最适合的机型。
    在这里插入图片描述

  • 手持终端
    该终端不仅能读取二维码,还能对读取的数据进行存储以及计算等信息处理工作。便携式终端可安装Windows CE,也可安装开发商独自研发的操作系统。终端上可以安装各种应用程序,还具备数据通信功能,实现了更为广泛的应用范围。
    在这里插入图片描述

  • 固定式扫描仪
    这种扫描仪可以嵌入在其他设备中,也可以安装在桌上使用。
    读取的数据将通过数据线传输到连接的电脑中进行处理。
    除了组装在入口闸门或工厂生产线上以外,还可以安装在普通商店以及活动会场等的桌上,用于读取优惠券、入场票等票务信息等。
    在这里插入图片描述

用普通手机、智能手机、平板电脑读取

QR码变种-微信小程序码

QR 码变种

在二维码发展到现在出现了很多变种,有彩色图片、动图、甚至非矩形的。这些变异二维码本质上与标准QR码原理一致,只是在编码排版上有所不同,因此生成和识别工具也不同。
在这里插入图片描述

微信小程序码

微信小程序码也是一种异形码,是腾讯2017年1月为微信小程序专门设计的一种二维码式样。这种异形码并不是微信的首创,Facebook、Snap等公司都已经推出过类似的异形码。
在这里插入图片描述
传统二维码有以下缺点:

  • 扫码预期:每张二维码的背后可能代表一个文件、一个页面、又或者是一个应用。
  • 安全性:二维码由于其开发性,很容易称为木马病毒的温床,很多人会担心扫码之后可能使自己的手机感染病毒而放弃扫码。
  • 品牌宣传:无法满足小程序的品牌宣传需求。

这种小程序码相比标准二维码有如下优点。

  • 观赏性: 小程序码与普通二维码相比,看起来更美观。
  • 扫码预期:扫码前能明确知道扫码之后会体验到一个小程序。
  • 安全性:小程序码目前只能通过微信产生,并且只能通过微信识别,安全性更高。
  • 品牌宣传:每个小程序码右下角都是固定的微信小程序logo,没见到一次小程序,大家就能多一次联想到微信小程序。
  • 高容错性:当一张二维码图片中间嵌有某些logo图片时,其实相当于把最中间部分有用的编码信息挖掉,再贴一张logo图片上去。而小程序码不同,中间的logo区域并不包含数据编码的部分,因此小程序码拥有更高的容错性。

这个是小程序码的规范设计稿:
在这里插入图片描述

目前小程序码一共支持3种容量,分别是36射线、54射线和72射线。
在这里插入图片描述
每个版本分别对应L、M、Q、H 4种容错级别:

  • L级容错的小程序码,大约10%的字码可以被修正。
  • M级容错的小程序码,大约15%的字码可以被修正。
  • Q级容错的小程序码,大约25%的字码可以被修正。
  • H级容错的小程序码,大约35%的字码可以被修正。

现阶段,当通过官方API文档去请求一张小程序码图片时,暂时不用指定期望生成的是哪种版本、哪个容错级别的小程序码,这些是微信后台会帮助开发者自动选择的。

小程序码生成的主要步骤。

  • 定位点
    确定3个定位点和右下脚的官方logo区,经过第一步小程序码的大小也随着确定。
    在这里插入图片描述

  • 信息编码区
    编码的过程主要是把原始信息(例如某个小程序的首页)转化成计算机能够识别的语言-二进制序列的过程。
    在这里插入图片描述
    加纠错码不只是让数据量简单的增大,一旦小程序的版本、纠错级别确定了,其对应的纠错码都是固定的了,这样解码阶段才能通过对应的规则去消除纠错码,把真正有用的数据保留下来。
    在这里插入图片描述
    经过信息转换和纠错编码之后,得到一串最终的二维码序列,就可以把信息按一定的编码顺序填充到小程序码的编码区(1对应的是黑色,0对应的是白色)。填充之后小程序上花瓣看起来很不均匀,如下图所示。
    在这里插入图片描述
    为了让小程序码的花瓣看起来更加均衡,需要再多做一步操作。
    逻辑异或(XOR,符号是⊕ )的基本知识,请看下面这个表格。
    在这里插入图片描述
    A ⊕ B ,当 AB 不等时值为 1,AB 相等时值为 0。A 和同一个 B 经过两次异或操作,结果跟原码相同(A ⊕ B ⊕ B = A)。
    在这里插入图片描述

  • 掩码操作
    将小程序码跟 32 种掩膜(又称「mask」,可依照一定的规则生成)进行异或运算,最终选取效果最佳的作为最终的小程序码。
    在这里插入图片描述

  • 功能性数据
    填充功能性数据,最终效果如下。
    在这里插入图片描述

pyzbar

pyzbar安装

sudo apt-get install libzbar0
pip install pyzbar
#或者
python3.6 -m pip install pyzbar --user
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
测试是否安装成功

from pyzbar import pyzbar
  • 1

Bounding boxes and polygons

在这里插入图片描述
在这里插入图片描述

识别定位二维码

import os
import sys
import argparse
from pyzbar import pyzbar
from PIL import Image, ImageEnhance
import cv2

def parse_arguments(argv):
    parser = argparse.ArgumentParser()
    parser.add_argument('--image_dir', type=str, help='input image dir', default='/opt/buty/data/logo_data/test')
    parser.add_argument('--save_path', type=str, help='save path', default='/opt/buty/data/logo_data/test_output')

    return parser.parse_args(argv)

def main(args):
    for img_name in os.listdir(args.image_dir):
        #img = Image.open(os.path.join(args.image_dir, img_name))
        #img = ImageEnhance.Brightness(img).enhance(2.0) # add brightness
        #img = ImageEnhance.Sharpness(img).enhance(17.0) # add sharpness
        #img = ImageEnhance.Contrast(img).enhance(4.0) # add constrast
        #img_gray = img.convert('L') # gray
        img = cv2.imread(os.path.join(args.image_dir, img_name))
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        barcodes = pyzbar.decode(img_gray)
        for barcode in barcodes:
            #location
            (x, y, w, h) = barcode.rect
            cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
            #decode
            barcodeData = barcode.data.decode('utf-8')
            barcodeType = barcode.type
            text = '({}):{}'.format(barcodeType, barcodeData)
            print(text)
            cv2.putText(img, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
            cv2.imwrite(os.path.join(args.save_path, img_name), img)

if __name__ == '__main__':
    main(parse_arguments(sys.argv[1:]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

参考资料
pyzbar 0.1.8
NaturalHistoryMuseum/pyzbar
python3+pyzbar+Image 进行图片二维码识别
Python识别条形码(pyzbar)
pyzbar 二维码、条形码识别
Python制作二维码和条形码扫描器 (pyzbar)
基于opencv4.0 pyzbar和python实现二维码实时检测+定位
ZengWenJian123/qrcode_recognition
PhilS94/QR-Code-Scanner
Gbellport/QR-code-localization-YOLOv3
keefeWu/QRCode
yushulx/opencv-yolo-qr-detection
二维码学习(一):概念篇
Android OpenCV(四十):QR二维码检测与识别
二维码的生成细节和原理
QRCode二维码总结
QR 码的成功之路
什么是QR码?
痞子衡嵌入式:走进二维码(QR Code)的世界(1)- 引言
你一定不知道,小程序码是这样绽放的
[译]ISO/IEC 18004-2015 二维码标准文档(1)
《微信小程序开发文档》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/680570
推荐阅读
相关标签
  

闽ICP备14008679号