zoukankan      html  css  js  c++  java
  • 【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

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

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

      

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

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

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

    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]])

    红色是原图中的三角形,绿色是应用仿射变换之后的目标图像的三角形,根据这个设置应用仿射变换之后图像应该像左边扭曲,有了这两个三角形的顶点坐标,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)
    

      

    点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()
    

      

    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.)

  • 相关阅读:
    云路五年 未来正来
    免费公测:RDS只读实例
    【Open Search产品评测】-- 淘点点:基于OpenSearch,轻松实现一整套O2O类搜索解决方案
    阿里云启动“云合计划” 培育中国“微软”级企业
    【Open Search产品评测】- 来往,7天轻松定制属于自己的搜索引擎
    水塘抽样算法
    如何调度考生的座位
    如何去除有序数组的重复元素
    二分查找高效判定子序列
    如何k个一组反转链表
  • 原文地址:https://www.cnblogs.com/eagler8/p/12923142.html
Copyright © 2011-2022 走看看