【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

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

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

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

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

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

import image
import lcd, sensor
import time

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

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


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


try:
    del img
    del img2
except Exception:
    pass

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

    image.warp_affine_ai(img, img2, matrix)

    img2.ai_to_pix()
    if flag:
        lcd.display(img2)
    else:
        lcd.display(img)
    flag = not flag
    time.sleep_ms(500)

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

串口输出
>>> 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]

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

变换模型
是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型。可采用的变换模型有如下几种:刚性变换、仿射变换、透视变换和非线形变换等,其中第三个的仿射变换就是这里要探讨的。

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

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

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

image — 机器视觉

移植于 openmv, 与 openmv 功能相同

get_affine_transform()函数

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

matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)])

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

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

举例说明

输入源图像中的三角形顶点坐标 ([[20, 20], [30, 20], [20, 0]])

输出目标图像中的三角形顶点坐标 ([[20, 20], [30, 20], [25, 0]])

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

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

尝试变动目标图像的三个顶点,看看有什么变化

matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)])

matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(40,80), (100, 60), (220, 180)])

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

import image
import lcd, sensor
import time

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

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


matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(40,80), (100, 60), (220, 180)])
print("matrix:")
print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[0], matrix[1], matrix[2]))
print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[3], matrix[4], matrix[5]))
print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[6], matrix[7], matrix[8]))


try:
    del img
    del img2
except Exception:
    pass

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

    image.warp_affine_ai(img, img2, matrix)

    img2.ai_to_pix()
    if flag:
        lcd.display(img2)
    else:
        lcd.display(img)
    flag = not flag
    time.sleep_ms(300)

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

点1, 2 和 3 (在图一中形成一个三角形) 与图二中三个点一一映射, 仍然形成三角形, 但形状已经大大改变. 如果我们能通过这样两组三点求出仿射变换 (你能选择自己喜欢的点), 接下来我们就能把仿射变换应用到图像中所有的点。

#MicroPython动手做(07)——零基础学MaixPy之机器视觉
#实验程序之二:image deal 图像处理(深色浮雕)

#MicroPython动手做(07)——零基础学MaixPy之机器视觉
#实验程序之二:image deal 图像处理(深色浮雕)

import sensor
import image
import lcd
import time

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
origin = (0,0,0, 0,1,0, 0,0,0)
edge = (-1,-1,-1,-1,8,-1,-1,-1,-1)
sharp = (-1,-1,-1,-1,9,-1,-1,-1,-1)
relievo = (2,0,0,0,-1,0,0,0,-1)

tim = time.time()
while True:
    img=sensor.snapshot()
    img.conv3(edge)
    lcd.display(img)
    if time.time() -tim >10:
        break
tim = time.time()
while True:
    img=sensor.snapshot()
    img.conv3(sharp)
    lcd.display(img)
    if time.time() -tim >10:
        break
tim = time.time()
while True:
    img=sensor.snapshot()
    img.conv3(relievo)
    lcd.display(img)
    if time.time() -tim >10:
        break

lcd.clear()

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

image deal 图像处理
读取图片(或者实时动态摄像),对像素点任意操作并生成图片,如对像素点进行ARGB的分解,或者将ARGB恢复成像素值,对每个像素点进行修改转换等等。
(Read the image, any operation on the pixels to generate the picture. If the pixel of ARGB decomposition or ARGB back into pixel values, modify the conversion, and so each pixel.)