• OpenMV简介以及基本中文教程请参见目前官网给出OpenMV中国的三家代理商,英文教程请参见官网以及官方论坛。此笔记是由于中文代理商不够全面的基础上,整合官网教程,自己可以最大程度的了解这个小巧易用的摄像头模块...

    OpenMV简介以及基本中文教程请参见目前官网给出OpenMV中国的三家代理商英文教程请参见官网以及官方论坛。此笔记是由于中文代理商不够全面的基础上,整合官网教程,自己可以最大程度的了解这个小巧易用的摄像头模块,也方便大家参考,*不保证正确,您所使用的代码,对您的openmv造成任何损害,我概不负责,慎用!*


    >0x01<—>MicroPython库<


    以下标准Python库内置于MicroPython中。对于其他库,请从micropython-lib存储库下载。Python标准库和微型库,以下标准Python库已经被“微观化”以适应MicroPython的理念。它们提供该模块的核心功能,旨在成为标准Python库的替代品。这些模块可以通过他们的 u-name引用,也可以通过它们的 non-u-name来获得。 non-u-name该名称的文件应在你的package路径中。例如,import json 将首先搜索 json.py 文件或 json 目录,如果找到它就可加载该包。如果没有找到任何内容,它将回退加载内置ujson模块。
    官网给出的几个模块,引用方法同Python的基本语法一样,先 import,再 name.function()

    • gc - 控制垃圾收集器
    • math - 数学函数库
    • select - 等待一组流上的事件
    • sys - 系统特定功能
    • ubinascii - 二进制/ ASCII转换
    • uhashlib - 哈希算法
    • uio - 输入/输出流
    • ujson - JSON编码和解码
    • uos - 基本的“操作系统”服务
    • ure - 正则表达式
    • usocket - 提供对BSD的访问。
    • ustruct - 打包和解包原始数据类型
    • utime - 时间相关功能
    • uzlib - zlib解压缩

    举个栗子

    import  math
    
    def degrees(radians):   #弧度制和角度制的转换计算
        return (180 * radians) / math.pi
    

    对于OpenMV,开发者,封装了专门的库,用于使用者调用,简单方便。

    pyb     # 与电路板相关的功能(板级功能)
            #时间相关功能 (部分可以与time类替换)
            #复位相关功能
            #中断相关功能
            #电源相关功能
            #其他功能
            #类(class)
    ########其他类#########
    ADC     #- 模数转换
            #构造函数(Constructors)
            #方法(Methods)
    
    DAC     #- 数模转换
            #构造函数
            #方法
    
    CAN     #总线控制器局域网通信总线
            #构造函数
            #类方法(Class Methods)
            #方法
            #常量(Constants)
    
    ExtInt  #- 配置I / O引脚以在外部事件中中断
            #构造函数
            #类方法
            #方法
            #常量
    
    I2C     # - 一个双线串行协议
            #构造函数
            #方法
            #常量
    
    LED     #LED,板子上已经内置了几个led
            #构造函数
            #方法
    
    I / O   #引脚
            #构造函数
            #类方法
            #方法
            #常量
    
    servo   #- 3线伺服驱动器
            构造函数
            方法
    
    SPI类    #- 主驱动串行协议
            #构造函数
            #方法
            #常量
    
    Timer  #- 控制内部定时器
            #构造函数
            #方法
    
    TimerChannel    #- 为定时器设置通道
                    #方法
    
    UART    #- 双工串行通信总线
            #构造函数
            #方法
            #常量
            #流量控制
    
    USB_VCP #- USB虚拟通信端口
            #构造函数
            #方法
    
    time    #- 追踪经过时间
            #功能
            #构造函数
            #方法
    
    sensor  #- 摄像头传感器
            #功能
            #常量
    
    image   #- 机器视觉
            #功能
    
    HaarCascade     #- 特征描述符
                    #构造函数
    
    Histogram       #- 直方图对象
                    #方法
    
    Percentile      #百分位数对象
    方法
    
    Statistics      #- 统计对象
                    #方法
    
    Blob            #- Blob对象
                    #方法
    
    Line            #- Line对象
    
    Circle          #- Circle对象
                    #方法
    
    Rect            #- Rectangle Object
                    #方法
    
    QRCode          #- QRCode对象,扫码
                    #方法
    
    AprilTag        #- AprilTag对象,3D识别***标签***
                    #方法
    
    DataMatrix      #- DataMatrix对象
                    #方法
    
    BarCode         #- BarCode对象
                    #方法
    
    kptmatch        #- 关键点对象
                    #方法
    
    ImageWriter     #- ImageWriter对象
                    #构造函数
                    #方法
    
    ImageReader     # - ImageReader对象
                    #构造函数
                    #方法
    Image           #- 图像对象
                    #构造函数
                    #方法
                    #常量
    
    gif             #- gif录音
    
    Gif             #Gif录音机
                    #构造函数
                    #方法
    
    mjpeg           #- mjpeg录音
    
    Mjpeg           #- Mjpeg录音机
                    #构造函数
                    #方法
    
    lcd             #- lcd屏蔽驱动程序,配套官方屏幕
                    #功能
    
    fir             #- 热电屏蔽驱动器(fir ==远红外线)
                    #功能
    
    cpufreq         #- 简单的cpu频率控制
                    #功能
                    #常量
    
    machine         #- 与电路板相关的功能
                    #复位相关功能
                    #中断相关功能
                    #电源相关功能
                    #杂项功能
                    #类
    
    I2C             #- 一个双线串行协议
                    构造函数
                    一般方法
                    原始I2C操作
                    标准 bus 操作
                    内存操作

    代码实例

    import sensor, image, time,pyb
    from pyb import UART
    from pyb import Pin
    
    green_threshold=(45,75,-40,-10,4,30)
    blue_threshold   = ( 30 ,45,0,30,-62,-39)
    
    ROI=(77,8,221,216)#设置检测区域(兴趣范围)
    
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.RGB565) # use RGB565.
    sensor.set_framesize(sensor.QVGA) # use QQVGA for speed.
    sensor.set_brightness(-1)#亮度
    sensor.skip_frames(10) # Let new settings take affect.
    sensor.set_auto_gain(False) # must be turned off for color tracking
    sensor.set_auto_whitebal(False) # must be turned off for color tracking
    #关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡。
    clock = time.clock() # Tracks FPS.
    
    
    single_out =  Pin('P0', Pin.OUT_PP)#IO操作,注意对应OpenMV引脚
    single_out.low()
    
    # P4->TX ,P5->RX
    uart = UART(3, 115200)#先实例化一个19200波特率的串口3,
    pyb.delay(1000)#板级毫秒延时,也可以time.ticks()替换,
    
    send_data_2=[0xf1,0,0,0,0,0,0,0,0,0xf2]
    while(True):
        clock.tick() # Track elapsed milliseconds between snapshots().
        send_data=[]
        send_data.append(0xf0)
        img = sensor.snapshot() # Take a picture and return the image.
        green_blobs = img.find_blobs([green_threshold],roi=ROI)
    
        sum_bai=len(green_blobs)
        #print("bai%d:"%sum_bai)#调试用
        if sum_bai>=1:
        #如果找到了目标颜色
            for b in green_blobs[0:1]:#只取一个
            #迭代找到的目标颜色区域
                # Draw a rect around the blob.
                img.draw_rectangle(b[0:4],color=(255,255,255)) # rect
                #用白色矩形标记出目标颜色区域
                img.draw_cross(b[5], b[6]) # cx, cy
                #发打送包(8bit/位),精度保留
                send_data.append(b[5]//256)
                send_data.append(b[5]%256)
                send_data.append(b[6]//256)
                send_data.append(b[6]%256)
                #在目标颜色区域的中心画十字形标记
        if sum_bai==0:#保证数据包一样长
            send_data.append(send_data_2[1])
            send_data.append(send_data_2[2])
            send_data.append(send_data_2[3])
            send_data.append(send_data_2[4])
        #蓝色识别追踪
        blue_blobs = img.find_blobs([blue_threshold],roi=ROI)
        sum_blue=len(blue_blobs)
        if blue_blobs:
            #如果找到了目标颜色
            for b in blue_blobs:
                #迭代找到的目标颜色区域
                    # Draw a rect around the blob.
                    img.draw_rectangle(b[0:4],color=(0,0,0)) # rect
                    #用白色矩形标记出目标颜色区域
                    img.draw_cross(b[5], b[6]) # cx, cy
                    #在目标颜色区域的中心画十字形标记
                    send_data.append(b[5]//256)
                    send_data.append(b[5]%256)
                    send_data.append(b[6]//256)
                    send_data.append(b[6]%256)
                    break
                    #在目标颜色区域的中心画十字形标记
        if sum_blue==0:
                send_data.append(send_data_2[5])
                send_data.append(send_data_2[6])
                send_data.append(send_data_2[7])
                send_data.append(send_data_2[8])
    
        img.draw_rectangle(ROI)
        print(clock.fps()) # 帧率值,Note: Your OpenMV Cam runs about half as fast while
        # connected to your computer. The FPS should increase once disconnected.
        print("white: %d blue: %d"%(sum_bai,sum_blue))
        send_data.append(0xf1)#帧尾
        #自定义数据帧完毕,拉高P0为高电平,出发单片机外部IO中断接收数据包
        single_out.high()
        pyb.delay(5)
        for i in send_data:
            uart.writechar(i)
        print(send_data)#调试用
        send_data_2=send_data#更新包,目标出现短暂检测不出使用上一个位置的值
        pyb.delay(1)#延迟再拉低P0,发送完毕,在示波器下可看出P0为高电平时,有UART3的发送引脚有电平变化即数据发送
        single_out.low()
    展开全文
  • OpenMV嵌入式图像处理

    2018-03-26 20:22:02
    OpenMV嵌入式图像处理OpenMV中文首页: http://openmv.cc上手教程,详细参数,中文文档,软件下载链接都在http://openmv.cc 论坛是提问的第一选择,论坛地址:https://forum.singtown.com/category/5/openmv-cam...

    OpenMV嵌入式图像处理


    OpenMV中文首页: http://openmv.cc


    上手教程,详细参数,中文文档,软件下载链接都在http://openmv.cc 论坛是提问的第一选择,论坛地址:https://forum.singtown.com/category/5/openmv-cam


    立即购买: https://kaizhi-xu.taobao.com/

    OpenMV官网: https://www.openmv.io
    OpenMV中国网站: http://www.openmv.cc

    版权所有

    本书版权所属广州星瞳信息科技有限责任公司,未经授权禁止一切形式的转载抄袭,侵权必究。

    本书适合什么人?

    • 对嵌入式机器视觉感兴趣的人。
    • 对OpenMV感兴趣,并想在项目里使用OpenMV的人。
    • 对计算机视觉感兴趣的人,通过OpenMV,可以做出一些好玩的项目,激发学习计算机视觉的兴趣,而不会卡在傅立叶变化,小波变换,滤波之类的事情上。

    OpenMV是什么?

    简单的来说,它是一个可编程的摄像头,通过MicroPython语言,可以实现你的逻辑。
    而且摄像头本身内置了一些图像处理算法,很容易使用。

    OpenMV适合做什么?

    • DIY相关的项目制作,比如追踪小球的车,云台,或者解魔方的机器人。

    • 对成本要求很高的嵌入式工业方案,比如流水线物品的分拣。

    OpenMV不适合做什么?

    • 高像素的处理任务。OpenMV只有30万的像素,通常使用320_240的分辨率来处理图像,OpenMV3 Cam M7采集图像采集图像分辨率最高可以达到640_480,无法获得更高的像素。

    • 复杂的算法:比如OCR识别,车牌识别,猫狗分类,深度学习之类的。

    本书需要一些什么背景知识?

    • 本书尽量通俗易懂,也不会钻研图像算法的细节,不需要有图像处理的背景知识。

    • 有过一门编程语言,了解if else等逻辑语句,知道变量赋值等概念。

    • 有面向对象的概念,了解类,对象,方法等概念。

    • 有单片机的基本概念,了解IO口,电压,串口等概念。

    更多的资源?

    展开全文
  • 详情请参考https://book.openmv.cc/python-background.html 官方教程 ...此处仅作备忘录。...openmv算是我第一次接触到的图像处理入门设备,对于专业不涉及图像处理领域,但是需要应用相关功能的人来...

    详情请参考https://book.openmv.cc/python-background.html 官方教程
    https://docs.singtown.com/micropython/zh/latest/openmvcam/index.html 官方函数库
    此处仅作备忘录,官方文档已经非常详尽了。

    ——

    前言

    openmv算是我第一次接触到的图像处理入门设备,对于专业不涉及图像处理领域,但是需要应用相关功能的人来说,这小玩意算是物超所值,学习成本很低(相比树莓派+摄像头),你要做的只是熟悉一下mircopython语法。
    想来openmv接触了有一个月(我觉得挺长了),也实现了不少小功能(可惜只是用了裸机操作)。 这篇文章算是对openmv的回顾,因为有相当一段时间没摸它了,毕竟花了这么常时间研究它,怕把这些经验遗忘了。

    基础内容

    在开始之前请先注意,openmv和opencv是两个完全不同的概念,几乎不存在相互移植的可能性。

    openmv简介

    openmv是一个可以通过MicroPython语言进行编程的摄像头(实际上也只能使用MicroPython,并不能使用C语言,但是其运算速度是可以忍受的),内置了一些图像处理算法,使用时可以直接调用库实现功能,所有的功能基本上都是通过堆叠库实现的。
    openmv通常用于DIY相关的项目制作(也就是说适合学生和爱好者)。

    openmv的选购
    尽可能选择OPENMV3 M7摄像头及以上版本的(如果出了的话),这是因为stm32系列处理图像能力有限,低版本会有很多功能无法实现,掉帧情况也会变得难以忍受。
    使用时请支持正版,低于正常价格的产品可能会影响功能的实现。

    openmv的功能

    openmv常用的功能有板级控制(略去不讲,但很重要)、画图(drawing)、图像滤波(image-filters)、拍摄(snapshot)、特征检测(feature-detection)、颜色追踪(color-tracking)、codes、测距等。

    mircopython

    python是面向对象的图形语言(c语言是面向过程)。Python 的发展以 CPython 为主,MicroPython 和 CPython 在 Python3 语法上保持高度的一致性,包含Python标准库的一小部分,但常用的标准语法命令都已经支持。相比于python,mircopython通常用于资源有限的嵌入式设备。
    对mircopython的学习点到即止,因为它不是用于嵌入式开发的常用语言。

    OV摄像头

    omnivision简称OV,美商半导体公司,中文名豪威科技,专业开发高度集成CMOS影像技术。openmv3采用OV7725 sensor。

    图像处理

    在与颜色处理有关的功能实现中,openmv使用的就是LAB模式或灰度模式。
    LAB模式
    Lab颜色空间中,L代表亮度;a的正数代表红色,负端代表绿色;b的正数代表黄色,负端代表兰色。因此L分量可以调整亮度对,修改a和b分量的输出色阶来做精确的颜色平衡。
    在这里插入图片描述
    噪声
    噪声即噪点,是图像中一种亮度或颜色信息的随机变化,而被拍摄物体本身并没有,这给图像带来了错误和额外的信息。

    图像处理算子
    数学中的映射,当映射的作用是把函数映成函数,或者函数映成数的时候,这个映射常常叫做算子.图像处理里都把图像看成R²上的函数,每个像素只是这个函数的采样点。在这个意义下,算子就是把一个R²上的函数变化到另一个R²上的函数的一个变换。

    图像滤波

    总结自 http://www.ruanyifeng.com/blog/2017/12/image-and-wave-filters.html 图像与滤波 阮一峰
    简洁明了。

    图像本质上就是各种色彩波的叠加,可以用波的算法处理图像。色彩剧烈变化的地方,就是图像的高频区域;色彩稳定平滑的地方,就是低频区域。通过使用滤波器(filter)可以过滤掉某些波,保留另一些波。

    通用配置

    此处为常用功能都会涉及的通用设置。

    感光元件配置

    需引用sensor模块,用于设置感光元件的参数。

    import sensor#引入感光元件的模块
    
    # 设置摄像头
    sensor.reset()#初始化感光元件
    sensor.set_pixformat()#设置像素模式,括号内可选sensor.GRAYSCALE: 灰度or sensor.RGB565: 彩色
    sensor.set_framesize()#设置图像的大小
    sensor.set_auto_gain()#自动增益开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动增益。
    sensor.set_auto_whitebal()#自动白平衡开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动白平衡。
    sensor.skip_frames()#跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。
    
    

    其中图像大小可设置为:
    sensor.QQQVGA: 80×60
    sensor.QQVGA: 160x120
    sensor.HQVGA: 240x160
    sensor.QVGA: 320x240
    sensor.VGA: 640x480 (只用于OpenMV Cam M7 的灰度图处理图像,或者彩图采集图像)

    图像处理要实现的功能越复杂,分辨率就要设置的越低,或者切换为灰度模式,以此来提高帧数。

    拍摄(snapshot)

    img = sensor.snapshot()#image=img
    sensor.snapshot().save("example.jpg") # or "example.bmp" (or others)
    #需要SD卡
    

    ROI(region of interest)

    ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。

    ROI=(x0,y0,x1,y1)#设置roi位置
    img.draw_rectangle(ROI)#在图像中标注感兴趣区域
    

    帧率显示(fps)

    需引入time模块

    clock = time.clock()                # Create a clock object to track the FPS.返回一个时钟对象
    #初始化时钟
    clock.tick()                    # Update the FPS clock.开始追踪运行时间
    print("FPS:", clock.fps())#可输出帧率.停止追踪运行时间,并返回当前FPS
    

    也可以直接在图像中显示帧率。
    注意: 当连接电脑后,OpenMV会变成一半的速度。当不连接电脑,帧率会增加。

    阈值(thresholds)

    阈值有LAB阈值和灰度阈值。
    OpenMV 的IDE里加入了阈值选择工具(位于 工具 → Mechine Vision → Threshold Editor ,选中 Frame Buffer可以获取IDE中的图像)来确定阈值。使用方法为拖动六个滑块,将目标颜色变成白色,其他颜色全变为黑色。
    阈值的格式为:

    rgb = (minL, maxL, minA, maxA, minB, maxB)#彩色
    grayscale = (min,max)
    

    镜头畸变矫正(lens correction)

    img.lens_corr(1.8) # strength of 1.8 is good for the 2.8mm lens.
    #或者
     img = sensor.snapshot().lens_corr(strength = 1.8, zoom = 1.0)#二者纯粹是语法上的差异
    

    用于扫码,形状识别等。

    具体功能的实现

    某些函数省略了不常用的参数设置,详情请参考官方函数库文档。

    画图(drawing)

    实现此功能需引入image(机器视觉)模块。
    常用的可绘制图形有箭头arrow、圆形circle、十字cross、线段line、矩形rectangle、文字text

    image.draw_xxx(x0, y0, x1, y1, color) #颜色可以是灰度值(0-255),或者是彩色值(r, g, b)
    
    

    图像滤波(image filters)

    实现此功能需引入image(机器视觉)模块。

    二值化( Image Binarization)

    注意与灰度化的区分。

    在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
    分为颜色二值化灰度二值化

    img.binary([threshold])#二值化分割
    BINARY_VISIBLE = True or False #设置是否使用img.binary()函数进行图像分割
    img = sensor.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else sensor.snapshot()#用来切换二值化视角或彩色/灰度视角
    
    

    边缘检测(edge detection)

    利用morph算子实现快速边缘检测,速度慢但效果好。

    #设置核函数滤波,核内每个数值值域为[-128,127],核需为列表或元组
    kernel_size = 1 # kernel width = (size*2)+1, kernel height = (size*2)+1
    kernel = [-1, -1, -1,\
              -1, +8, -1,\
              -1, -1, -1]
    img.morph(kernel_size, kernel)
    

    在OV7725 sensor上, 边缘检测可以通过设置sharpness/edge寄存器来增强。

    侵蚀函数

    img.erode(1, threshold = 2)
        #侵蚀函数erode(size, threshold=Auto),去除边缘相邻处多余的点。threshold
        #用来设置去除相邻点的个数,threshold数值越大,被侵蚀掉的边缘点越多,边缘旁边白色杂点越少
      
    

    快速边缘检测(feature Detection edges)

    利用canny算子实现快速边缘检测,编程非常简单,速度快但效果差。

     img.find_edges(image.EDGE_CANNY, threshold=(a,b))
    

    特征检测(feature detection)

    特征检测应用较多的有图形检测,如识别圆、识别线段、识别直线、识别矩形。应用上通常把特征检测和颜色追踪结合起来,并通过绘图将检测到的图形在图像中标出。
    实现此功能需引入image(机器视觉)模块。

    图形检测

    通常是用霍夫变换完成的。

     for c in img.find_circles(threshold = 3500, x_margin = 10, y_margin = 10, r_margin = 10,r_min = 2, r_max = 100, r_step = 2): #threshold 控制从霍夫变换中监测到的圆,只返回大于或等于阈值的圆
     						#x/y/r_margin 控制所检测的圆的合并;
    					 #r_min,r_max和r_step控制测试圆的半径,缩小测试圆半径的数量可以大大提升性能
            img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0)) #找到图像中所有的圆
    

    线段
    相比寻找无限长的直线,速度降低不少。

    直线
    霍夫变换将二维空间中所有的直线映射到以theta&rho为坐标轴的二维空间中,theta代表直线与Y轴负方向的夹角,以Y轴负轴为起始轴,逆时针旋转到直线的角度。rho表示原点到直线的距离,Y轴截距大于0的均为正,Y轴截距小于0则rho为负。

    min_degree = 
    max_degree =
    
    for l in img.find_lines(threshold = 1000, theta_margin = 25, rho_margin = 25):
            if (min_degree <= l.theta()) and (l.theta() <= max_degree):
                img.draw_line(l.line(), color = (255, 0, 0))
    

    矩形

    for r in img.find_rects(threshold = 10000):
            img.draw_rectangle(r.rect(), color = (255, 0, 0))
            for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0)) #标注4个角
    

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

    线性回归(linear regression)

    线性回归分为鲁棒线性回归(linear regression robust)和快速线性回归(linear regression fast)。线性回归通常用于机器人巡线。快速线性回归的原理是使用最小二乘法来拟合线。

    line = img.get_regression(threshold, robust = True or False) #robust为1时开启鲁棒线性回归
    if (line): img.draw_line(line.line(), color ) #标注检测出的直线
    
    

    颜色追踪(color-tracking)

    实现此功能需引入image(机器视觉)模块。

    单色识别

    分为单灰度识别和单彩色识别。

    for blob in img.find_blobs([threshold])
    

    多颜色识别

    for blob in  img.find_blobs([threshold0,threshold1,threshold2,...]) #最多有16个阈值
    

    codes

    使用前需进行镜头畸变矫正。
    可测量条形码barcodes、二维码qrcodes、矩形码datamatrices等。
    条形码的代码相对复杂很多,最简单的时二维码。

     for code in img.find_qrcodes(): #识别二维码
            img.draw_rectangle(code.rect(), color = (255, 0, 0))
            print(code)
    

    测距

    虽然可以使用Apriltag进行3D定位,但通常情况下我们只能使用裸机测距(特别是距离目标物较远时,低成本测距传感器将无法派上用场)。
    OpenMV采用的是单目摄像头,需要利用参照物的大小比例来计算距离。
    其公式为:距离 = 一个常数/直径的像素
    该常数的测量方法为:让被测物距离摄像头 n cm,打印出摄像头里直径的像素值,然后相乘,就得到了常数的值。

    先这样,有空再继续补充。

    展开全文
  • 中国第二产业占GDP比重超过40%,从业人数超过2亿人,在国家经济转型的大形势下,未来第二产业的从业人数必然会继续减少,而工业是国家经济发展命脉,如何在人工成本增加,从业人员减少的情况下保持工业良好发展,是...

    中国第二产业占GDP比重超过40%,从业人数超过2亿人,在国家经济转型的大形势下,未来第二产业的从业人数必然会继续减少,而工业是国家经济发展命脉,如何在人工成本增加,从业人员减少的情况下保持工业良好发展,是我们亟需思考的问题。

    从西方国家历史发展经验来看,提高生产效率是解决目前局面的方法之一,但目前市场上的机械臂造价昂贵,再加上解决方案落地的费用,远远超过了低端工人的人工费。同时由于非标机械的定制化程度较高,很难形成适用性较强的解决方案。本文探讨了利用人工智能技术,提高方案的通用性,从而降低工业自动化成本。

    原文地址:http://process-z.com/openmv_arm/

    现有解决方案和不足

    在枕式包装机上,工人需要将待包装的产品放到移动的凹槽上,机器以一定的速率(一般超过100个/分钟)封边并剪切。一台机器一般需要3人同时操作,一年的人工成本10万元以上。

    • 工人将白色梳子放到蓝色槽中

    优化方案

    图像识别+机械臂上料

    包装的产品一般是牙刷、牙膏、梳子等等,通过图像识别定位物体位置,再通过机械臂吸取或夹取,放到指定地点即可。

    图像识别

    需求:从固定背景上识别、定位不特定物体。

    OpenMV是一款低价,可扩展,支持Python的机器视觉模块。OpenMV搭载MicroPython解释器,可以在嵌入式芯片上使用Python来编程 (Python 3 )。Python使机器视觉算法的编程变得简单得多。比如,直接调用find_blobs()方法,就可以获得一个列表,包含所有色块的信息。详细教程和文档参见这里

    由于被识别物体不是确定的,生产线上可能需要生产各种颜色和形状的产品,所以我们很难采用机器学习的方法来识别,于是我们考虑用传统的机器视觉方法。

    OpenMV允许我们识别某一颜色范围或灰度范围的色块,由于产品颜色各异,甚至有透明部分,所以在灰度图像中直接识别会产生分块,如下图。

    灰度图像色块识别

    分块的原因是设置的阈值与物体实际灰度范围不符合,优化方向有以下几种。

    1. 规范化背景色,使背景灰度值范围缩小,方便滤除背景。
    2. 采用与产品颜色反差较大的背景,我这里采用纯黑色。
    3. 光照条件好,不能有阴影影响。
    4. 通过滤波方法进一步扩大物体与背景的色差

    OpenMV提供了多种滤波方法,我们可以根据实际情况采用,这里我使用了二值化,即将图片根据阈值划分为黑白两个部分,通过调优参数,最终达到下图的效果。

    • 二值化

    • 腐蚀膨胀

    • 根据色块定位物体

    上图的效果是对图像进行开操作后的结果,开操作即对图像先腐蚀再膨胀,用于去掉图像中的小颗粒。具体解释参见这里

    OpenMV可以识别色块位置并框出色块,给出色块角度和中心坐标。根据中心坐标和角度即可定位物体,进行抓取。

    机械臂

    目前消费机的桌面机械臂单价在2-3万元,本实验采用低成本的舵机机械臂,整机价格在600元左右。舵机机械臂的寿命和精度肯定达不到工业使用的标准,如果是搬运等简单任务,需要低成本的方案,可以算用滑台,或者采用工业机械臂。

    目前市场上性价比较高、对开发者较友好的机械臂有XARMDOBOT。原文地址:http://process-z.com/openmv_arm/

    展开全文
  • OpenMv基础

    2020-04-22 23:08:30
    OpenMV嵌入式图像处理,它帮助轻松的完成机器视觉应用。你可以通过高级语言Python脚本,这里先看一下基础语法。

    前言

    OpenMV是嵌入式图像处理,其摄像头是一款小巧,低功耗,低成本的电路板,它帮助轻松的完成机器视觉(machine vision)应用。

    可以通过高级语言Python脚本(准确的说是 MicroPython ),而不是C/C++。Python的高级数据结构使你很容易在机器视觉算法中处理复杂的输出。但是,你仍然可以完全控制OpenMV,包括IO引脚。

    可以很容易的使用外部终端触发拍摄或者或者执行算法,也可以把算法的结果用来控制IO引脚。

    简单的来说,OpenMV是一个可编程的摄像头,通过MicroPython语言,可以实现逻辑。而且摄像头本身内置了一些图像处理算法,很容易使用。那么后期就可以使用OpenMV做一些计算机机器视觉的好玩项目了。

    星瞳科技是OpenMV中国官方代理,还做了好多中文视频,特别适合我这种小白。bilibili观看地址:https://space.bilibili.com/22215525/#/

    色块监测 例子如下,也太贴心了,每行都有注释。

    # 色块监测 例子
    #
    # 这个例子展示了如何通过find_blobs()函数来查找图像中的色块
    # 这个例子查找的颜色是深绿色
    
    import sensor, image, time
    
    # 颜色追踪的例子,一定要控制环境的光,保持光线是稳定的。
    green_threshold   = (   0,   80,  -70,   -10,   -0,   30)
    #设置绿色的阈值,括号里面的数值分别是L A B 的最大值和最小值(minL, maxL, minA,
    # maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需
    #设置(min, max)两个数字即可。
    
    sensor.reset() # 初始化摄像头
    sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
    sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 速度快一些
    sensor.skip_frames(time = 2000) # 跳过2000s,使新设置生效,并自动调节白平衡
    sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的,在颜色识别中,一定要关闭白平衡。
    sensor.set_auto_whitebal(False)
    #关闭白平衡。白平衡是默认开启的,在颜色识别中,一定要关闭白平衡。
    clock = time.clock() # 追踪帧率
    
    while(True):
        clock.tick() # Track elapsed milliseconds between snapshots().
        img = sensor.snapshot() # 从感光芯片获得一张图像
    
        blobs = img.find_blobs([green_threshold])
        #find_blobs(thresholds, invert=False, roi=Auto),thresholds为颜色阈值,
        #是一个元组,需要用括号[ ]括起来。invert=1,反转颜色阈值,invert=False默认
        #不反转。roi设置颜色识别的视野区域,roi是一个元组, roi = (x, y, w, h),代表
        #从左上顶点(x,y)开始的宽为w高为h的矩形区域,roi不设置的话默认为整个图像视野。
        #这个函数返回一个列表,[0]代表识别到的目标颜色区域左上顶点的x坐标,[1]代表
        #左上顶点y坐标,[2]代表目标区域的宽,[3]代表目标区域的高,[4]代表目标
        #区域像素点的个数,[5]代表目标区域的中心点x坐标,[6]代表目标区域中心点y坐标,
        #[7]代表目标颜色区域的旋转角度(是弧度值,浮点型,列表其他元素是整型),
        #[8]代表与此目标区域交叉的目标个数,[9]代表颜色的编号(它可以用来分辨这个
        #区域是用哪个颜色阈值threshold识别出来的)。
        if blobs:
        #如果找到了目标颜色
            for b in blobs:
            #迭代找到的目标颜色区域
                # Draw a rect around the blob.
                img.draw_rectangle(b[0:4]) # rect
                #用矩形标记出目标颜色区域
                img.draw_cross(b[5], b[6]) # cx, cy
                #在目标颜色区域的中心画十字形标记
    
        print(clock.fps()) # 注意: 你的OpenMV连到电脑后帧率大概为原来的一半
        #如果断开电脑,帧率会增加
    

    电源

    OpenMV有两个电源输入端:VIN(有时也会标识为VCC)和USB输入。

    VIN输入为3.6V~5V,推荐5V。
    USB和VIN可以同时供电。

    OpenMV有一个电源输出端:3.3V,这个电压是OpenMV的稳压器输出的,用于给其他传感器供电。

    注意:不要给3.3V直接供电,没有内部芯片的保护,很容易烧毁。
    在这里插入图片描述

    SD卡

    如果代码太多,flash装不下,就可以使用SD卡,这个是OpenMv自带的,SD卡也是一个文件系统,当上电的时候,如果插入SD卡,那么SD卡的文件系统就会自动取代内置的Flash文件系统,每次上电,就会运行SD卡中的main.py。SD卡最大支持32G的容量。

    图像处理背景

    感光元件

    从物理学和数学我们都接触过小孔成像,这是一种理想的相机模型,图像透过镜头,照在一个感光芯片上,感光芯片可以把光照的波长和强度等信息转成计算机(数字电路)可以识别的数字信号。
    感光元件如下,摄像头用螺丝固定在感光元件正上方就好,如果感光元件上面有灰尘什么的就用棉签擦一下。
    在这里插入图片描述

    像素

    感光元件是有很多个感光点构成的,比如有640*480个点,每个点就是一个像素。

    分辨率

    把每个点的像素收集整理起来,就是一副图片,那么这张图片的分辨率就是640*480。

    帧率

    每秒钟处理的图片数量。

    颜色

    不同波长的电磁波。

    LAB亮度-对比度

    这个是在查找指定颜色模块时要用的,a的正数代表红色,负端代表绿色;b的正数代表黄色,负端代表蓝色。

    Python

    这个是此板块必学的,这里再回顾一下常用语法吧,把自己不熟练的地方也总结了一下。

    使用好处

    OpenMV可以使用Python来进行二次开发。有几个好处:
    1.上手简单。
    2.不用考虑内存的申请和释放。
    3.有很多MicroPython库可以直接用(并不兼容PC上的Python模块)。
    4.开发团队开发了OpenMV的各种算法和模块可供调用。

    REPL和串口

    OpenMV的IDE自带一个串口助手,用于连接OpenMV,也可以连接其他的串口,比如Arduino,pyboard,esp8266。这个串口可以直接从IDE到达,然后就可以到达终端了。

    从这里进入
    在这里插入图片描述
    选择连接serial port
    在这里插入图片描述
    到达终端
    在这里插入图片描述

    语法

    print()函数

    print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出,但是print()会依次打印每个字符串,遇到逗号“,”会输出一个空格。
    print()可以打印整数,也可以直接计算结果。

      print(100 + 200)
    

    或者

       print('100 + 200 =', 100 + 200)
    

    输出

    100 + 200 = 300
    

    其中的’100 + 200 ='是字符串而非数学公式,是Python解释器自动计算出的。

    变量

    如下,就是将静态语言赋值给动态语言

    a = 'ABC' # a变为字符串
    

    注:静态语言在定义变量时必须指定变量类型

    list列表

    list是一种数据结构,一种有序的集合,可以随时添加和删除其中的元素。

    1.获取元素个数

    以下的变量classmates就是一个list。用len()函数可以获得list元素的个数为三,那如果一个list中一个元素也没有,就是一个空的list,它的长度为0。

    classmates = ['Michael', 'Bob', 'Tracy']
    len(classmates)
    

    2.索引访问

    可以用索引来访问list中每一个位置的元素,但是要记得索引是从0开始的,要确保索引不要越界。
    索引还可以倒着写,比如最后一个元素:classmates[-1],以此类推。那classmates[-2]就是倒数第二个元素。

    3.插入

    把元素插入到指定的位置

    classmates.insert(1, 'Jack')
    

    4.删除

    删除list末尾的元素

    classmates.pop()
    

    5.替换

    classmates[1] = 'Sarah'
    

    6.数据类型

    list里面的元素的数据类型也可以不同的哦。

    tuple元组

    这也是一种有序列表。

    注:tuple一旦初始化就不能修改,就是不能赋值,替换什么的了。

    也就是说,当定义一个tuple的时候,tuple的元素就必须被确定下来。如果只有1个元素的tuple定义时必须加一个逗号,,来消除是数学意义上小括号的歧义。

    t = (1,)
    

    条件判断

    这里有用到elif,直接进行下一个条件判断,并且不用加分号。
    切记加冒号
    if语句的完整形式是:

    if <条件判断1>:
        <执行1>
    elif <条件判断2>:
        <执行2>
    elif <条件判断3>:
        <执行3>
    else:
        <执行4>
    

    循环

    1.for x in 循环

    就是把每个元素代入变量x,然后执行缩进块的语句。
    range(101)就可以生成0-100的整数序列,计算如下:

    sum = 0
    for x in range(101):
        sum = sum + x
    print(sum)
    

    2.while循环

    这个是C语言里面也接触过的,但是这里运用可以不加分号。

    数据类型转换

    比如int()函数可以把其他数据类型转换为整数,float-小数(浮点数),double-极大或极小的浮点数,char-字符型。

    定义函数

    def power(x):#函数名,参数
        return x * x#一定要缩进,函数体
    

    注:定义的函数体一定要缩进

    在power(x)函数中,参数x就是一个位置参数。若像power(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。

    切片

    如L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。如果第一个索引是0,还可以省略:L[:3]。

    注:tuple和list切片后数据类型不变。

    'ABCDEFG'[:3]
    'ABC'#还是字符不变
    
    展开全文
  • OpenMV是基于STM32处理的机器视觉模块,集成了OV7725摄像头芯片和镜头。用C语言实现了核心的机器视觉算法,提供Python编程接口。发明家、爱好者以及智能设备开发商可以用Python语言使用OpenMV提供的机器视觉功能,为...
  • 最近闲来无事,吃鸡之余折腾了几天树莓派,在跑过几次图像识别等Demo之后顿时对嵌入式机器视觉产生浓厚的兴趣。趁现在有时间调研了一下嵌入式视觉的发展历程,在这里简单记录一下自己这几天的探索。 嵌入式处理器有...
  • OpenMV简介 By far the easiest way I’ve found to learn and use advanced computer vision. This single board can do everything from driving a car to landing a drone. 目前位置, 这是我目前发现入手...
  • 它成本低易拓展,开发环境友好,除了用于图像处理外,还可以用Python调用其硬件资源,进行I/O控制,与现实世界进行交互。 一、如何通过串口发送数据—-UART 1、UART用法读写操作 uart.read(10) # read 10 ...
  • 它成本低易拓展,开发环境友好,除了用于图像处理外,还可以用Python调用其硬件资源,进行I/O控制,与现实世界进行交互。 购买了一块星瞳科技的M7的板子来进行学习和实践。  下载 IDE  下载地址:...
  • 你好!这里是风筝的博客,欢迎和我一起交流。看了好几篇一直opencv的文章,都是几年前的,而且版本比较旧,对着弄会发现有的地方是和现在是有改动的。所以,2017年末,记录了此次移植过程,移植版本比较新的可以看...
  • 大家好,我是痞子衡,是正经搞技术的痞子。本系列痞子衡给大家...痞子衡当年硕士毕业论文课题就是工业相机图像处理相关的,算是机器视觉系统的前端核心。遥想十年以前,想要从事机器视觉系统的开发一直是比较复杂...
  • OPENMV和STM32的识别追踪小车(详细版)之STM32端 二:STM32的介绍以及程序 2.1(STM32F407介绍) STM32F407提供了工作频率为168 MHz的Cortex™-M4内核(具有浮点单元)的性能。我的32是正点原子的最小系统板,它大...
  • OpenMv也是一个单片机

    2020-04-23 18:12:58
    还是对openmv的基础运用作以介绍。
  • 而且摄像头本身内置了一些图像处理算法,很容易使用。 适合做DIY相关的项目制作,比如追踪小球的车,云台,或者解魔方的机器人。以及对成本要求很高的嵌入式工业方案,比如流水线物品的分拣。 足以满足基本的应用...
  • 长连接摄像头可以和主板分开。比如在智能小车应用当中,摄像头安装到车头...在OpenMV代码中添加模拟摄像头的sensor代码,由于都是使用的DCMI接口,OpenMV sensor.c的代码大部分可以共用。注意DCMI reset和pwr_down管脚
  • OpenMV简介By far the easiest way I’ve found to learn and use advanced computer vision. This single board can do everything from driving a car to landing a drone. 目前位置, 这是我目前发现入手并且使用...
  • 作者:Jacob Beningo,嵌入式软件顾问(jacob@beningo.com) 译者:刘帝伟 审校:刘翔宇 责编:周建丁(zhoujd@csdn.net) 最近几年,Python已经成为相当热门的程序语言。它以著名的Monty Python喜剧组命名...
  • 1. Micropython与Openmv关系 ​ Openmv是国外的一种基于micropython驱动的开源机器视觉模块,在机器视觉算法上,已经做了很大的优化,可以很好的在MCU上快速运行,比如颜色跟踪,脸部检测等;并且引出了相关的外设,...
1 2 3
收藏数 50
精华内容 20
关键字:

openmv嵌入式图像处理