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是一款基于MicroPython编程语言的嵌入式视觉开发板,专门用于图像处理和计算机视觉应用。针对表面瑕疵检测而言,OpenMV Cam提供了一些主要特点、应用场景和需要注意的事项,具体如下:
主要特点:
图像处理功能:OpenMV Cam具备强大的图像处理能力,内置了丰富的图像处理算法和函数,可以进行图像采集、预处理、特征提取、目标检测等操作,支持灰度图像和彩色图像处理。
低功耗设计:OpenMV Cam采用高效的硬件架构和优化的固件,具有低功耗特性,适合长时间运行和嵌入式应用。
丰富的接口和扩展性:OpenMV Cam具备多样的接口,包括UART、I2C、SPI、GPIO等,可以方便地与其他传感器、设备进行通信和集成。同时,它也支持MicroSD卡存储和LCD显示屏连接,为数据存储和结果展示提供了便利。
实时性能:OpenMV Cam具备较快的图像处理速度,能够实现实时的表面瑕疵检测,对于要求快速响应和即时反馈的应用场景非常适用。
应用场景:
表面瑕疵检测:OpenMV Cam可以应用于表面瑕疵检测任务,例如电子产品的质量检验、印刷品的缺陷检测、纺织品的质量控制等。通过图像采集和处理,可以自动化地检测和识别表面上的缺陷、损伤、污渍等问题。
工业自动化:OpenMV Cam在工业自动化领域具有广泛应用,可以用于产品检测、零件排序、机器视觉导航等任务。通过视觉感知和处理,可以实现自动化生产线上的质量控制和过程监测。
智能安防:OpenMV Cam可以用于智能安防系统中的图像识别和检测任务,例如人脸识别、入侵检测、动作捕捉等。结合其实时性能和接口扩展性,可以构建智能监控系统、智能门禁系统等应用。
需要注意的事项:
算法调优:对于表面瑕疵检测任务,需要根据具体的应用场景和需求,选择合适的图像处理算法和参数进行调优。根据实际情况,可能需要对图像预处理、阈值设置、特征提取等进行优化,以提高检测准确率和效率。
光照条件:光照条件对于图像处理和表面瑕疵检测非常重要。确保在采集图像时,光照充足、均匀,避免阴影和反光等问题,以保证图像质量和检测效果。
数据集和标注:针对特定的表面瑕疵检测任务,可能需要构建合适的数据集并进行标注,用于训练和优化算法模型。合理选择和处理数据集对于提高检测精度和泛化能力至关重要。
计算资源限制:OpenMV Cam是一款嵌入式开发板,其计算资源相对有限。在设计和实现表面瑕疵检测算法时,需要考虑计算资源的限制,确保算法能够在有限的硬件资源下高效运行。
需要注意的是,以上提到的特点、应用场景和注意事项是基于OpenMV Cam和MicroPython的一般理解和经验,具体的应用和实施可能会有所不同。针对具体的项目和需求,建议深入研究OpenMV Cam的技术文档、示例代码和社区讨论,以获取更详细和准确的信息,并根据实际情况进行定制开发和调试。
案例一:表面瑕疵检测
import sensor, image, time
# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
# 定义表面瑕疵检测函数
def detect_defect():
while True:
img = sensor.snapshot()
defect = img.find_blobs([(100, 200)], area_threshold=200, pixels_threshold=100, merge=True)
if defect:
img.draw_rectangle(defect[0].rect())
img.draw_cross(defect[0].cx(), defect[0].cy())
sensor.display(img)
time.sleep(1000)
# 运行表面瑕疵检测程序
detect_defect()
解读:这个程序首先导入了所需的库,然后设置了摄像头的参数。接着定义了一个表面瑕疵检测的函数,该函数通过循环不断捕获图像并使用find_blobs方法检测瑕疵。如果检测到瑕疵,就在图像上绘制一个矩形框和十字线,并显示图像。最后,运行表面瑕疵检测程序。
案例二:表面瑕疵检测(使用阈值)
import sensor, image, time
# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
# 定义表面瑕疵检测函数(使用阈值)
def detect_defect_threshold():
while True:
img = sensor.snapshot()
# 设置像素阈值
pixel_threshold = (30, 100)
# 使用阈值检测瑕疵
defect = img.find_blobs([pixel_threshold], area_threshold=200, pixels_threshold=100, merge=True)
if defect:
img.draw_rectangle(defect[0].rect())
img.draw_cross(defect[0].cx(), defect[0].cy())
sensor.display(img)
time.sleep(1000)
# 运行表面瑕疵检测程序(使用阈值)
detect_defect_threshold()
解读:这个程序与第一个案例类似,但在检测瑕疵时使用了阈值。首先设置像素阈值,然后使用find_blobs方法检测瑕疵。其他部分与第一个案例相同。
案例三:表面瑕疵检测(使用颜色阈值)
import sensor, image, time
# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
# 定义表面瑕疵检测函数(使用颜色阈值)
def detect_defect_color_threshold():
while True:
img = sensor.snapshot()
# 设置颜色阈值
color_threshold = ((30, 30, 30), (100, 100, 100))
# 使用阈值检测瑕疵
defect = img.find_blobs([color_threshold], area_threshold=200, pixels_threshold=100, merge=True)
if defect:
img.draw_rectangle(defect[0].rect())
img.draw_cross(defect[0].cx(), defect[0].cy())
sensor.display(img)
time.sleep(1000)
# 运行表面瑕疵检测程序(使用颜色阈值)
detect_defect_color_threshold()
解读:这个程序与前两个案例类似,但在检测瑕疵时使用了颜色阈值。首先设置颜色阈值,然后使用find_blobs方法检测瑕疵。其他部分与前两个案例相同。
案例四:检测表面上的黑色瑕疵
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(0)
sensor.run(1)
threshold = (20, 20, 20)
while True:
img = sensor.snapshot()
blobs = img.find_blobs([threshold], pixel_threshold=20, area_threshold=50)
if blobs:
for blob in blobs:
img.draw_rectangle(blob.rect(), color=(255, 0, 0), thickness=2)
print(blobs)
img.show()
要点解读:
首先导入所需的模块,并设置摄像头参数。
设置颜色阈值,这里检测的是黑色瑕疵,因此将RGB阈值设置为(20, 20, 20)。
在while循环中,不断捕获图像并查找瑕疵。find_blobs()函数用于查找图像中的瑕疵,参数包括颜色阈值、像素阈值和面积阈值。这里将像素阈值设置为20,面积阈值设置为50。
如果找到瑕疵,则在图像上用红色矩形框出瑕疵位置,并输出瑕疵信息。
最后显示处理后的图像。
案例五:检测表面上的圆形瑕疵
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(0)
sensor.run(1)
threshold = (120, 255)
circle_threshold = 10000
while True:
img = sensor.snapshot()
blobs = img.find_blobs([threshold], pixel_threshold=20, area_threshold=50)
circles = img.find_circles(threshold, x_stride=2, y_stride=2, r_stride=1, r_min=10, r_max=50)
if circles:
for circle in circles:
if circle.area() > circle_threshold:
img.draw_circle(circle.center(), circle.r(), color=(255, 0, 0), thickness=2)
print(circles)
img.show()
要点解读:
首先导入所需的模块,并设置摄像头参数。这里将像素格式设置为灰度图像。
设置灰度阈值,这里检测的是圆形瑕疵,因此将阈值设置为(120, 255)。同时设置圆的最小半径和最大半径,这里分别为10和50。
在while循环中,不断捕获图像并查找圆形瑕疵。find_circles()函数用于查找图像中的圆形瑕疵,参数包括灰度阈值、x方向步长、y方向步长、半径步长、最小半径和最大半径。这里将x和y方向步长设置为2,半径步长设置为1。
如果找到圆形瑕疵,则判断其面积是否大于设定的阈值,如果是则在图像上用红色圆形框出瑕疵位置,并输出瑕疵信息。这里将面积阈值设置为10000。
最后显示处理后的图像。
案例六:检测表面上的多种颜色瑕疵
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(0)
sensor.run(1)
thresholds = [(20, 20, 20), (255, 0, 0), (0, 255, 0), (0, 0, 255)] # 黑色、红色、绿色、蓝色阈值
colors = ["Black", "Red", "Green", "Blue"] # 对应颜色名称
area_threshold = 50 # 面积阈值
while True:
img = sensor.snapshot()
blobs = [] # 存储检测到的瑕疵
for i in range(len(thresholds)): # 遍历每个颜色阈值
blob = img.find_blobs([thresholds[i]], pixel_threshold=20, area_threshold=area_threshold)
if blob:
blobs += blob # 将检测到的瑕疵添加到blobs列表中
for j in range(len(blobs)): # 遍历每个检测到的瑕疵
color = colors[thresholds.index(blobs[j].color())] # 获取瑕疵对应的颜色名称
img.draw_rectangle(blobs[j].rect(), color=(255, 0, 0), thickness=2) # 用红色矩形框出瑕疵位置
print("Detected {} blob: {}".format(color, blobs[j])) # 输出瑕疵信息
img.show() # 显示处理后的图像
要点解读:
首先导入所需的模块,并设置摄像头参数。这里将像素格式设置为RGB565。
设置多种颜色阈值,这里检测的是黑色、红色、绿色和蓝色瑕疵。同时设置面积阈值,这里为50。
在while循环中,不断捕获图像并查找多种颜色瑕疵。通过遍历每个颜色阈值,使用find_blobs()函数查找图像中对应颜色的瑕疵,并将检测到的瑕疵添加到blobs列表中。
如果找到瑕疵,则在图像上用红色矩形框出瑕疵位置,并输出瑕疵的颜色和位置信息。这里使用blobs[j].color()获取瑕疵的颜色,使用blobs[j].rect()获取瑕疵的位置。
最后显示处理后的图像。
案例七:颜色识别:
import sensor
import image
import time
import pyb
from pyb import LED
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
led = LED(1)
while True:
img = sensor.snapshot()
# 设置颜色阈值
red_threshold = (30, 100, 15, 127, 15, 127)
green_threshold = (15, 50, -64, -8, -32, 32)
blue_threshold = (-30, 30, -30, 30, 0, 64)
# 执行颜色识别
red_blobs = img.find_blobs([red_threshold])
green_blobs = img.find_blobs([green_threshold])
blue_blobs = img.find_blobs([blue_threshold])
# 绘制识别结果
for blob in red_blobs:
img.draw_rectangle(blob.rect())
img.draw_cross(blob.cx(), blob.cy())
for blob in green_blobs:
img.draw_rectangle(blob.rect())
img.draw_cross(blob.cx(), blob.cy())
for blob in blue_blobs:
img.draw_rectangle(blob.rect())
img.draw_cross(blob.cx(), blob.cy())
print("FPS:", clock.fps())
要点解读:
该程序使用OpenMV Cam的sensor和image模块进行颜色识别。
在示例中,首先对摄像头进行初始化设置,包括像素格式、帧大小等。
在主循环中,使用sensor.snapshot()获取当前图像。
设置颜色阈值,分别对红色、绿色和蓝色进行颜色识别。
使用img.find_blobs()执行颜色识别,返回识别到的颜色块对象。
对于每个识别到的颜色块,可以绘制矩形框和交叉线进行标识。
案例八:形状检测:
import sensor
import image
import time
import pyb
from pyb import LED
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
led = LED(1)
while True:
img = sensor.snapshot()
# 执行形状检测
blobs = img.find_blobs()
# 绘制检测结果
for blob in blobs:
if blob.roundness() > 0.5:
img.draw_rectangle(blob.rect())
img.draw_cross(blob.cx(), blob.cy())
print("FPS:", clock.fps())
要点解读:
该程序使用OpenMV Cam的sensor和image模块进行形状检测。
在示例中,首先对摄像头进行初始化设置,包括像素格式、帧大小等。
在主循环中,使用sensor.snapshot()获取当前图像。
使用img.find_blobs()执行形状检测,返回检测到的形状块对象。
对于每个检测到的形状块,可以根据其圆度(roundness)进行判断并绘制矩形框和交叉线进行标识。
案例九:纹理检测:
import sensor
import image
import time
import pyb
from pyb import LED
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
led = LED(1)
while True:
img = sensor.snapshot()
# 执行纹理检测
hist = img.get_histogram()
texture = hist.get_percentile(0.1)
# 绘制检测结果
for x in range(img.width()):
for y in range(img.height()):
if img.get_pixel(x, y) < texture:
img.set_pixel(x, y, (0, 0, 0))
else:
img.set_pixel(x, y, (255, 255, 255))
print("FPS:", clock.fps())
要点解读:
该程序使用OpenMV Cam的sensor和image模块进行纹理检测。
在示例中,首先对摄像头进行初始化设置,包括像素格式、帧大小等。
在主循环中,使用sensor.snapshot()获取当前图像。
使用img.get_histogram()获取图像的直方图,并通过get_percentile()方法获取纹理阈值。
遍历图像的每个像素,根据像素值与纹理阈值的比较,对像素进行二值化处理。
绘制检测结果,将低于纹理阈值的像素设为黑色,其他像素设为白色。
这些示例程序展示了在OpenMV Cam上进行表面瑕疵检测的基本方法。你可以根据实际需求对这些示例代码进行进一步修改和扩展,以适应不同的场景和应用要求。
请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。