openmv之扫码

守給你的承諾、 提交于 2020-01-30 15:40:33

以下图片可右击查看放大后查看左下角打印数据

二维码

 1 import sensor, image
 2 
 3 sensor.reset()
 4 sensor.set_pixformat(sensor.RGB565)
 5 sensor.set_framesize(sensor.QQVGA) # can be QVGA on M7...
 6 sensor.skip_frames(30)
 7 sensor.set_auto_gain(False) # must turn this off to prevent image washout...
 8 while(True):
 9     img = sensor.snapshot()
10     img.lens_corr(1.8) # strength of 1.8 is good for the 2.8mm lens.
11     for code in img.find_qrcodes():
12         print(code)             

 

 

 

 image.find_qrcodes([roi])

查找 roi 内的所有二维码并返回一个 image.qrcode 对象的列表。 请参考 image.qrcode 对象以获取更多信息。

 为使这一方法成功运行,图像上二维码需比较平展。因为openmv的镜头为鱼眼镜头可以通过物理镜头消除畸变影响,也可以通过使用 sensor.set_windowing 函数在镜头中心放大、image.lens_corr

函数来消解镜头的桶形畸变或通过更换视野较为狭小的镜头, 您可得到一个不受镜头畸变影响的更为平展的二维码。有些机器视觉镜头不会造成桶形失真,但是其造价远比OpenMV提供的标准镜片高,这种镜头为无畸变镜头。

roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定,ROI即整幅图像的图像矩形。 操作范围仅限于 roi 区域内的像素。

不支持压缩图像和bayer图像。

此方法在OpenMV Cam M4 上不可用。

qrcode.corners()

返回一个由该对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。

qrcode.rect()

返回一个矩形元组(x, y, w, h),用于如二维码的边界框的 image.draw_rectangle 等其他的 image 方法。

qrcode.x()

返回二维码的边界框的x坐标(int)。

您也可以通过索引 [0] 取得这个值。

qrcode.y()

返回二维码的边界框的y坐标(int)。

您也可以通过索引 [1] 取得这个值。

qrcode.w()

返回二维码的边界框的w坐标(int)。

您也可以通过索引 [2] 取得这个值。

qrcode.h()

返回二维码的边界框的h坐标(int)。

您也可以通过索引 [3] 取得这个值。

qrcode.payload()

返回二维码有效载荷的字符串,例如URL 。该示例中的内容为openmv  

您也可以通过索引 [4] 取得这个值。

qrcode.version()

返回二维码的版本号(int)。

您也可以通过索引 [5] 取得这个值。

qrcode.ecc_level()

返回二维码的ECC水平(int)。

您也可以通过索引 [6] 取得这个值。

qrcode.mask()

返回二维码的掩码(int)。

您也可以通过索引 [7] 取得这个值。

qrcode.data_type()

返回二维码的数据类型。

您也可以通过索引 [8] 取得这个值。

qrcode.eci()

返回二维码的ECI。ECI储存了QR码中存储数据字节的编码。若您想要处理包含超过标准ASCII文本的二维码,您需要查看这一数值。

您也可以通过索引 [9] 取得这个值。

qrcode.is_numeric()

若二维码的数据类型为数字式,则返回True。

qrcode.is_alphanumeric()

若二维码的数据类型为文字数字式,则返回True。

qrcode.is_binary()

若二维码的数据类型为二进制式,则返回True。如果您认真处理所有类型的文本,则需要检查eci是否为True,以确定数据的文本编码。通常它只是标准的ASCII,但是它也可能是有两个字节字符的UTF8。

qrcode.is_kanji()

若二维码的数据类型为日本汉字,则返回True。设置为True后,您就需要自行解码字符串,因为日本汉字符号每个字符是10位,而MicroPython不支持解析这类文本

 

条形码

 1 import sensor, image, time, math
 2 
 3 sensor.reset()
 4 sensor.set_pixformat(sensor.GRAYSCALE)
 5 sensor.set_framesize(sensor.VGA) # High Res!
 6 sensor.set_windowing((640, 80)) # V Res of 80 == less work (40 for 2X the speed).
 7 sensor.skip_frames(30)
 8 sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
 9 sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...
10 clock = time.clock()
11 
12 # Barcode  detection can run at the full 640x480 resolution of your OpenMV Cam's
13 # OV7725 camera module.  Barcode detection will also work in RGB565 mode but at
14 # a lower resolution.  That said, barcode detection requires a higher resolution
15 # to  work well so it should always be run at 640x480 in grayscale...
16 
17 def barcode_name(code):
18     if(code.type() == image.EAN2):
19         return "EAN2"
20     if(code.type() == image.EAN5):
21         return "EAN5"
22     if(code.type() == image.EAN8):
23         return "EAN8"
24     if(code.type() == image.UPCE):
25         return "UPCE"
26     if(code.type() == image.ISBN10):
27         return "ISBN10"
28     if(code.type() == image.UPCA):
29         return "UPCA"
30     if(code.type() == image.EAN13):
31         return "EAN13"
32     if(code.type() == image.ISBN13):
33         return "ISBN13"
34     if(code.type() == image.I25):
35         return "I25"
36     if(code.type() == image.DATABAR):
37         return "DATABAR"
38     if(code.type() == image.DATABAR_EXP):
39         return "DATABAR_EXP"
40     if(code.type() == image.CODABAR):
41         return "CODABAR"
42     if(code.type() == image.CODE39):
43         return "CODE39"
44     if(code.type() == image.PDF417):
45         return "PDF417"
46     if(code.type() == image.CODE93):
47         return "CODE93"
48     if(code.type() == image.CODE128):
49         return "CODE128"
50 
51 while(True):
52     clock.tick()
53     img = sensor.snapshot()
54     codes = img.find_barcodes()
55     for code in codes:
56         img.draw_rectangle(code.rect())
57         print_args = (barcode_name(code), code.payload(), (180 * code.rotation()) / math.pi, code.quality(), clock.fps())
58         print("Barcode %s, Payload \"%s\", rotation %f (degrees), quality %d, FPS %f" % print_args)
59     if not codes:
60         print("FPS %f" % clock.fps())

 

 

barcode.corners()

返回一个由该对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。

barcode.rect()

返回一个矩形元组(x, y, w, h),用于如数据矩阵的边界框的 image.draw_rectangle 等其他的 image 方法。

barcode.x()

返回条形码的边界框的x坐标(int)。

您也可以通过索引 [0] 取得这个值。

barcode.y()

返回条形码的边界框的y坐标(int)。

您也可以通过索引 [1] 取得这个值。

barcode.w()

返回条形码的边界框的w宽度(int)。

您也可以通过索引 [2] 取得这个值。

barcode.h()

返回条形码的边界框的h高度(int)。

您也可以通过索引 [3] 取得这个值。

barcode.payload()

返回条形码的有效载荷的字符串。例:数量。

您也可以通过索引 [4] 取得这个值。

barcode.type()

返回条形码的列举类型 (int)。

您也可以通过索引 [5] 取得这个值。

  • image.EAN2
  • image.EAN5
  • image.EAN8
  • image.UPCE
  • image.ISBN10
  • image.UPCA
  • image.EAN13
  • image.ISBN13
  • image.I25
  • image.DATABAR
  • image.DATABAR_EXP
  • image.CODABAR
  • image.CODE39
  • image.PDF417 - 未来启用 (e.g. 现在还不能正常使用).
  • image.CODE93
  • image.CODE128
barcode.rotation()

返回以弧度计的条形码的旋度(浮点数)。

您也可以通过索引 [6] 取得这个值。

barcode.quality()

返回条形码在图像中被检测到的次数(int)。

扫描条形码时,每一条新的扫描线都能解码相同的条形码。每次进行这一过程,条形码的值都会随之增加。

您也可以通过索引 [7] 取得这个值。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!