【雕爷学编程】MicroPython手册之 OpenMV Cam 表面瑕疵检测

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
OpenMV Cam 是一款小型、低功耗的微控制器板,可以让你在现实世界中使用机器视觉轻松实现应用程序。你可以使用高级 Python 脚本(由 MicroPython 操作系统提供)而不是 C/C++ 对 OpenMV Cam 进行编程。OpenMV Cam 的技术参数包括以下几个方面:

1、处理器:OpenMV Cam H7 Plus 使用 STM32H743II ARM Cortex M7 处理器,运行频率为 480 MHz,具有 32MB SDRAM + 1MB SRAM 和 32 MB 外部闪存 + 2 MB 内部闪存。OpenMV Cam M4 V2 使用 STM32F427VG ARM Cortex M4 处理器,运行频率为 180 MHz,具有 256KB RAM 和 1 MB 闪存。
2、图像传感器:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都使用 OV7725 图像传感器,能够在分辨率高于 320x240 时以 75 FPS 拍摄 320x240 8 位灰度图像或 320x240 16 位 RGB565 图像,在分辨率低于 320x240 时能够以 150 FPS 拍摄。
3、I/O 接口:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都具有以下 I/O 接口:
(1)全速 USB (12Mbs) 接口,连接到电脑。当插入 OpenMV Cam 后,你的电脑会出现一个虚拟 COM 端口和一个“U盘”。
(2)μSD 卡槽能够进行 100Mbs 读/写,使你的 OpenMV Cam 能够录制视频,并把机器视觉的素材从 μSD 卡提取出来。
(3)SPI 总线的运行速度高达 54Mbs,使你可以简单地把图像流数据传给 LCD 扩展板、WiFi 扩展板,或者其他控制器。
(4)I2C 总线(高达 1Mb/s)、CAN 总线(高达 1Mb/s)和异步串行总线(TX/RX,高达 7.5Mb/s),用于与其他控制器或传感器连接。
(5)一个 12 位 ADC 和一个 12 位 DAC。
(6)所有 I/O 引脚上都有中断和 PWM(板上有 9 或者10个 I/O 引脚)。
4、LED:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都配备了一个 RGB LED(三色)和两个高亮的 850nm IR LED(红外)。
5、镜头:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都配备了标准 M12 镜头接口和一个默认的 2.8 毫米镜头。如果你想在 OpenMV Cam 上使用更专业的镜头,你可以轻松购买并自行安装。

在这里插入图片描述
MicroPython的OpenMV Cam可以用于表面瑕疵检测任务,下面将从专业的视角,详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

高分辨率图像采集:OpenMV Cam具备高分辨率的图像采集能力,可用于捕捉细微的表面瑕疵。它采用优化的图像传感器和图像处理算法,能够提供清晰、细节丰富的图像,便于瑕疵的检测和分析。
强大的图像处理能力:OpenMV Cam内置了图像处理芯片和丰富的图像处理算法,支持图像增强、滤波、边缘检测等功能。这些功能可以帮助教师和学生对图像进行预处理,提高瑕疵检测算法的准确性和稳定性。
灵活的算法开发环境:OpenMV Cam基于MicroPython编程语言,提供了灵活的算法开发环境。教师和学生可以使用Python编写自定义的瑕疵检测算法,并与OpenMV Cam进行交互。这使得算法的开发和调试变得简单且易于实现。
实时反馈和结果显示:OpenMV Cam支持实时反馈和结果显示功能。它可以在瑕疵检测过程中实时显示检测结果,方便教师和学生进行实时的调试和分析。这有助于及时发现问题并优化算法的性能。

应用场景:

制造业质检:OpenMV Cam可以应用于制造业的表面瑕疵检测,如电子产品、塑料制品等。通过对产品表面进行图像采集和分析,可以自动检测并定位瑕疵,提高质量控制的效率和准确性。
食品安全检测:OpenMV Cam也可以应用于食品安全领域的瑕疵检测。通过对食品表面进行图像分析,可以检测出可能存在的异物、变质、污染等问题,保障食品安全和质量。
纺织品检测:OpenMV Cam可用于纺织品制造过程中的瑕疵检测。通过对纺织品表面进行图像采集和处理,可以自动检测并定位织物上的瑕疵,提高产品质量和生产效率。

需要注意的事项:

瑕疵样本和数据集:教师和学生需要准备具有代表性的瑕疵样本和充足的数据集,以训练和评估瑕疵检测算法。样本的选择和数据集的构建对于算法的准确性和鲁棒性非常重要。
参数调优和算法优化:瑕疵检测算法的性能往往与参数的调优和算法的优化密切相关。教师应指导学生进行算法的参数调优和效果评估,以提高瑕疵检测的精度和效率。
环境光照和背景噪声:环境光照和背景噪声可能会对表面瑕疵检测产生一定的影响。教师和学生需要注意环境的控制和光照条件,以确保瑕疵检测算法的稳定性和可靠性。

综上所述,MicroPython的OpenMV Cam在表面瑕疵检测方面具备高分辨率图像采集、强大的图像处理能力、灵活的算法开发环境和实时反馈及结果显示等主要特点。它适用于制造业质检、食品安全检测和纺织品检测等应用场景。在使用过程中,教师和学生需要注意瑕疵样本和数据集的准备、参数调优和算法优化,以及环境光照和背景噪声的控制等事项。这些注意事项将有助于实现准确、高效的表面瑕疵检测算法。

案例一:使用OpenMV Cam进行边缘检测

import sensor, image, time
from scipy.ndimage import filters

# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 定义边缘检测函数
def edge_detection(img):
    edges = filters.sobel(img)
    return edges

# 主循环
while(True):
    img = sensor.snapshot()
    edges = edge_detection(img)
    img.draw_rectangle(edges, color=(255, 0, 0))
    print("找到表面瑕疵")

解读:这个程序首先导入了所需的库,然后设置了摄像头的参数。接着定义了一个边缘检测函数,该函数使用Sobel算子对图像进行卷积操作,得到边缘信息。在主循环中,程序不断捕获图像并调用边缘检测函数检测表面瑕疵。如果找到了瑕疵,就在图像上绘制一个矩形框并输出提示信息。

案例二:使用OpenMV Cam进行模板匹配

import sensor, image, time

# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 加载模板图像
template = sensor.snapshot()
template.save('template.bmp')

# 主循环
while(True):
    img = sensor.snapshot()
    img.draw_rectangle(template, color=(255, 0, 0))
    print("找到表面瑕疵")

解读:这个程序首先导入了所需的库,然后设置了摄像头的参数。接着加载了一个模板图像,并在主循环中不断捕获图像并与模板进行匹配。如果找到了瑕疵,就在图像上绘制一个矩形框并输出提示信息。

案例三:使用OpenMV Cam进行Hough变换

import sensor, image, time
from pyzbar.pyzbar import hough_line

# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 定义Hough变换函数
def hough_transform(img):
    lines = hough_line(img, 1, np.pi/180, 100)
    return lines

# 主循环
while(True):
    img = sensor.snapshot()
    lines = hough_transform(img)
    if lines:
        for line in lines:
            rho, theta = line[0]
            a = np.cos(theta)
            b = np.sin(theta)
            x0 = a * rho
            y0 = b * rho
            x1 = int(x0 + 1000 * (-b))
            y1 = int(y0 + 1000 * (a))
            x2 = int(x0 - 1000 * (-b))
            y2 = int(y0 - 1000 * (a))
            cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
        img.draw_rectangle(img.get_rect(), color=(255, 0, 0))
        print("找到表面瑕疵")

解读:这个程序首先导入了所需的库,然后设置了摄像头的参数。接着定义了一个Hough变换函数,该函数使用hough_line函数对图像进行霍夫变换,得到直线信息。在主循环中,程序不断捕获图像并调用Hough变换函数检测表面瑕疵。如果找到了瑕疵,就在图像上绘制一个矩形框并输出提示信息。

案例四:表面瑕疵检测
在这个示例中,我们将使用 OpenMV Cam 来检测一个物体表面是否有瑕疵。我们首先需要定义一个“无瑕疵”的图像模板,然后将拍摄的图像与该模板进行比较。差异部分可能就是瑕疵。

import sensor, image, time  
  
# 初始化摄像头  
sensor.reset()  
sensor.set_pixformat(sensor.RGB565)  
sensor.set_framesize(sensor.QVGA)  
sensor.skip_frames(time = 2000)  
  
# 加载“无瑕疵”模板图像  
template = sensor.snapshot()  
  
while(True):  
    # 拍摄图像  
    img = sensor.snapshot()  
      
    # 将拍摄的图像与模板进行比较  
    diff = img.compare_to_template(template, threshold = 70)  
      
    # 标记出差异部分(可能就是瑕疵)  
    img.draw_rectangle(diff.rect(), color = (255, 0, 0), thickness = 2)  
      
    # 显示图像  
    img.show()

要点解读:
上述代码使用 OpenMV Cam 的 compare_to_template 方法将拍摄的图像与模板进行比较。该方法返回一个包含差异区域的 Image 对象。我们使用 draw_rectangle 方法在差异区域周围画一个红色矩形,然后通过 show 方法显示出来。请注意,threshold 参数用于设置比较的阈值,不同的阈值可能会导致不同的结果。您可能需要根据实际应用情况进行调整。

案例五:颜色检测
在这个示例中,我们将使用 OpenMV Cam 来检测特定颜色的物体。我们将通过颜色阈值来过滤出我们感兴趣的颜色。

import sensor, image, time  
  
# 设置颜色阈值(这里设为红色)  
threshold = (100, 0, 100)  
  
# 初始化摄像头  
sensor.reset()  
sensor.set_pixformat(sensor.RGB565)  
sensor.set_framesize(sensor.QVGA)  
sensor.skip_frames(time = 2000)  
  
while(True):  
    # 拍摄图像  
    img = sensor.snapshot()  
      
    # 通过颜色阈值过滤出红色物体,并标记出它们的位置  
    red_objects = img.find_color(threshold)  
    for obj in red_objects:  
        img.draw_rectangle(obj.rect(), color = (255, 0, 0), thickness = 2)  
      
    # 显示图像  
    img.show()

要点解读:上述代码使用 OpenMV Cam 的 find_color 方法来查找图像中满足颜色阈值的区域。在这个示例中,我们通过设定阈值来查找红色物体。对于每一个找到的物体,我们在其周围画一个红色矩形,然后通过 show 方法显示出来。您可以根据实际需求调整颜色阈值。

案例六:形状识别
这个例子将检测图像中的直线和圆。

import cv2  
import numpy as np  
  
# 读取图像  
img = cv2.imread('shape.jpg', 0)  # 路径需要更改为你本地的图像路径  
  
# 直线检测  
edges = cv2.Canny(img, 50, 150)  
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, minLineLength = 100, maxLineGap = 10)  
  
# 在图像上画出直线  
for line in lines:  
    x1, y1, x2, y2 = line[0]  
    cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)  
  
# 圆检测  
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, dp=1.2, minDist=100, param1=50, param2=30, minRadius=0, maxRadius=0)  
circles = np.uint16(np.around(circles))  # 对返回的浮点值圆心和半径取整  
  
# 在图像上画出圆  
for i in circles[0,:]:  
    # 画圆心  
    cv2.circle(img, (i[0], i[1]), 3, (0, 255, 0), -1)  
    # 画圆轮廓  
    cv2.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 3)  
  
# 显示图像  
cv2.imshow('Shape Detection', img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

这段代码将读取一个图像文件,然后使用霍夫变换(Hough Transform)检测图像中的直线和圆形。在检测到形状后,它将在原始图像上绘制检测到的形状。请注意,这是一个基本的形状检测程序,可能需要根据你的具体需求进行调整。

案例七:颜色阈值检测:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

def surface_defect_detection():
    while True:
        img = sensor.snapshot()
        gray_img = img.to_grayscale()
        threshold_img = gray_img.threshold(100)
        defects = threshold_img.find_edges(threshold=1000)
        if defects:
            for defect in defects:
                # 在图像上绘制瑕疵区域
                img.draw_rectangle(defect.rect())
        
        img.show()

surface_defect_detection()

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行表面瑕疵检测。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个surface_defect_detection()函数,用于表面瑕疵检测。
在函数中,使用sensor.snapshot()函数获取当前图像。
将图像转换为灰度图像,使用img.to_grayscale()函数。
对灰度图像进行阈值处理,使瑕疵区域变为白色,使用gray_img.threshold()函数。
使用threshold_img.find_edges()函数找到图像中的边缘,参数包括阈值。
如果检测到瑕疵区域(defects列表不为空),则遍历每个瑕疵区域。
在图像上绘制瑕疵区域的矩形框,使用img.draw_rectangle()函数。
使用img.show()函数显示检测结果。

案例八:形状检测:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

def surface_defect_detection():
    while True:
        img = sensor.snapshot()
        gray_img = img.to_grayscale()
        threshold_img = gray_img.threshold(100)
        blobs = threshold_img.find_blobs([110, 255])
        if blobs:
            for blob in blobs:
                # 仅保留符合面积和圆形度要求的区域
                if blob.area() > 100 and blob.roundness() > 0.8:
                    # 在图像上绘制瑕疵区域
                    img.draw_rectangle(blob.rect())
        
        img.show()

surface_defect_detection()

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行表面瑕疵检测。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个surface_defect_detection()函数,用于表面瑕疵检测。
在函数中,使用sensor.snapshot()函数获取当前图像。
将图像转换为灰度图像,使用img.to_grayscale()函数。
对灰度图像进行阈值处理,使瑕疵区域变为白色,使用gray_img.threshold()函数。
使用threshold_img.find_blobs()函数找到图像中的连通区域,参数包括颜色范围。
如果检测到连通区域(blobs列表不为空),则遍历每个连通区域。
根据面积和圆形度要求判断是否为瑕疵区域,使用blob.area()和blob.roundness()函数。
在图像上绘制瑕疵区域的矩形框,使用img.draw_rectangle()函数。
使用img.show()函数显示检测结果。

案例九:神经网络检测:

import sensor
import image
import time
import nn

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

net = nn.load('/path/to/model.nn')

def surface_defect_detection():
    while True:
        img = sensor.snapshot()
        img.scale(64, 64)
        features = img.get_features()
        output = net.predict(features)
        if output[0] == 1:
            print("Defect detected!")
        
        img.draw_string(10, 10, "Defect: {}".format(output[0]))
        img.show()

surface_defect_detection()

要点解读:
该程序使用OpenMV Cam的sensor、image和nn模块进行表面瑕疵检测。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
使用nn.load()函数加载预训练的神经网络模型。
定义了一个surface_defect_detection()函数,用于表面瑕疵检测。
在函数中,使用sensor.snapshot()函数获取当前图像。
使用img.scale()函数将图像缩放为模型的输入大小。
使用img.get_features()函数提取图像的特征。
使用神经网络模型进行预测,使用net.predict()函数。
如果输出为1,表示检测到瑕疵,打印相应的信息。
在图像上绘制瑕疵检测结果的文本信息,使用img.draw_string()函数。
使用img.show()函数显示检测结果。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值