MicroPython动手做(07)——零基础学MaixPy之机器视觉-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5069|回复: 22

MicroPython动手做(07)——零基础学MaixPy之机器视觉

[复制链接]
发表于 2020-4-5 08:54 | 显示全部楼层 |阅读模式
0 (4).jpg

机器视觉 machine vision
机器视觉是人工智能正在快速发展的一个分支。机器视觉作为生产过程中关键技术之一,在机器或者生产线上,机器视觉可以检测产品质量以便将不合格的产品剔除,或者指导机器人完成组装工作,与整个生产密切相关。

 楼主| 发表于 2020-4-5 08:57 | 显示全部楼层
0 (2).jpg

什么是机器视觉?
简单来说,机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。机器视觉是一项综合技术,包括图像处理、机械工程技术、控制、电光源照明、光学成像、传感器、模拟与数字视频技术、计算机软硬件技术(图像增强和分析算法、图像卡、 I/O卡等)。一个典型的机器视觉应用系统包括图像捕捉、光源系统、图像数字化模块、数字图像处理模块、智能判断决策模块和机械控制执行模块。


 楼主| 发表于 2020-4-5 09:40 | 显示全部楼层
本帖最后由 eagler8 于 2020-12-30 15:26 编辑

#MicroPython动手做(07)——零基础学MaixPy之机器视觉

#实验程序之一:affine 仿射变换(实时缩放)

  1. #MicroPython动手做(07)——零基础学MaixPy之机器视觉
  2. #实验程序之一:affine 仿射变换(实时缩放)

  3. import image
  4. import lcd, sensor
  5. import time

  6. lcd.init()
  7. # lcd.init(type=2, freq=20000000)

  8. sensor.reset(freq=24000000)
  9. sensor.set_pixformat(sensor.RGB565)
  10. sensor.set_framesize(sensor.QVGA)


  11. matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)])
  12. print("matrix:")
  13. print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[0], matrix[1], matrix[2]))
  14. print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[3], matrix[4], matrix[5]))
  15. print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[6], matrix[7], matrix[8]))


  16. try:
  17.     del img
  18.     del img2
  19. except Exception:
  20.     pass

  21. img2 = image.Image(size=(320, 240))
  22. img2.pix_to_ai()
  23. flag = False
  24. while 1:
  25.     img = sensor.snapshot()

  26.     image.warp_affine_ai(img, img2, matrix)

  27.     img2.ai_to_pix()
  28.     if flag:
  29.         lcd.display(img2)
  30.     else:
  31.         lcd.display(img)
  32.     flag = not flag
  33.     time.sleep_ms(500)
复制代码


 楼主| 发表于 2020-4-5 09:43 | 显示全部楼层
01.jpg

串口输出
>>> init i2c2
[MAIXPY]: find gc3028
True
matrix:
[1.34, -0.12, -62.37]
[0.12, 1.34, -56.84]
[0.00, 0.00, 1.00]

 楼主| 发表于 2020-4-5 09:47 | 显示全部楼层
04.gif
 楼主| 发表于 2020-4-5 11:58 | 显示全部楼层
变换模型
是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型。可采用的变换模型有如下几种:刚性变换、仿射变换、透视变换和非线形变换等,其中第三个的仿射变换就是这里要探讨的。

04.jpg

 楼主| 发表于 2020-4-5 13:40 | 显示全部楼层
本帖最后由 eagler8 于 2020-4-5 14:08 编辑

仿射变换
拉伸、收缩、扭曲、旋转是图像的几何变换,在三维视觉技术中大量应用到这些变换,又分为仿射变换和透视变换。仿射变换可以将矩形转换成平行四边形,它可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例变化。透视变换提供了更大的灵活性,一个透视变换可以将矩阵转变成梯形。当然,平行四边形也是梯形,所以仿射变换是透视变换的子集。

06.jpg

 楼主| 发表于 2020-4-5 13:43 | 显示全部楼层
07.jpg
 楼主| 发表于 2020-4-5 14:14 | 显示全部楼层
image — 机器视觉
移植于 openmv, 与 openmv 功能相同

get_affine_transform()函数
计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6。仿射变换的原理就是根据源图像中一个三角形的顶点坐标和应用仿射变换之后的目标图像中一个三角形的顶点坐标计算出一个变换矩阵,然后将这个矩阵应用到整个源图像。

[mw_shl_code=arduino,true]matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)])[/mw_shl_code]

前面三组为输入源图像中的三角形顶点坐标
后面三组为输出目标图像中的三角形顶点坐标

 楼主| 发表于 2020-4-5 14:28 | 显示全部楼层
举例说明
输入源图像中的三角形顶点坐标 ([[20, 20], [30, 20], [20, 0]])
输出目标图像中的三角形顶点坐标 ([[20, 20], [30, 20], [25, 0]])

09.jpg


红色是原图中的三角形,绿色是应用仿射变换之后的目标图像的三角形,根据这个设置应用仿射变换之后图像应该像左边扭曲,有了这两个三角形的顶点坐标,get_affine_transform()函数就能计算得到一个仿射变换矩阵,并在原图应用仿射变换就得到了扭曲之后的图像(绿色的)。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-27 10:18 , Processed in 0.083429 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表