3.4.4- 先颜色后形状的方式 STM32串口通信 openmv+STM32串口通信 openmv串口通信openmv识别物体 openmv神经网络训练 openmv数字识
openmv教程合集 openmv入门到项目开发 openmv和STM32通信 openmv和opencv区别 openmv巡线 openmv数字识别教程LCD。
·
非常详细的视频和文字教程,讲解常见的openmv教程包括 巡线、物体识别、圆环识别、阈值自动获取等。非常适合学习openmv、K210、K230等项目
视频合集链接在:
openmv教程合集 openmv入门到项目开发 openmv和STM32通信 openmv和opencv区别 openmv巡线 openmv数字识别教程LCD
3.4.4- 先颜色后形状的方式
可以再试试先颜色后形状的识别方式。
import sensor, image, time
#教程作者:好家伙VCC
#欢迎交流群QQ: 771027961 作者邮箱: 1930299709@qq.com
#更多教程B站主页:[好家伙VCC的个人空间-好家伙VCC个人主页-哔哩哔哩视频](https://space.bilibili.com/434192043)
#淘宝主页链接:[首页-好家伙VCC-淘宝网](https://shop415231378.taobao.com)
#更多嵌入式手把手教程-尽在好家伙VCC
# 定义红色的颜色阈值(L, A, B),适用于Lab颜色空间
# 这个阈值用于识别红色区域,通过调整这些阈值来控制对红色的敏感度。
# 每个元组中的6个值分别表示Lab颜色空间中的L、A、B三个分量的最小值和最大值。
red_threshold = [(35, 69, 41, 127, -14, 57)] # (L_min, L_max, A_min, A_max, B_min, B_max)
# 初始化摄像头模块
sensor.reset() # 重置摄像头,准备工作
sensor.set_pixformat(sensor.RGB565) # 设置摄像头的像素格式为RGB565(16位色深)
sensor.set_framesize(sensor.QQVGA) # 设置摄像头的分辨率为QQVGA(160x120)
# *************************** 如果不需要镜像就注释掉以下代码 **************************
# 摄像头的镜像和翻转操作,根据摄像头模块的安装方向决定是否需要
sensor.set_vflip(True) # 设置垂直翻转。如果摄像头安装方向需要翻转,启用此选项
sensor.set_hmirror(True) # 设置水平翻转。如果摄像头安装方向需要翻转,启用此选项
# *************************** 如果不需要镜像就注释掉以上代码 **************************
sensor.skip_frames(time=2000) # 跳过前几帧的图像,确保图像稳定,防止刚开机时图像不清晰
sensor.set_auto_gain(False) # 关闭自动增益,用于颜色追踪,避免自动增益影响颜色识别
sensor.set_auto_whitebal(False) # 关闭自动白平衡,用于颜色追踪,避免自动白平衡影响颜色识别
# 创建一个时钟对象,用于计算和控制帧率
clock = time.clock() # 用于控制循环的时间和帧率
# 主循环,不断获取摄像头图像并进行处理
while(True):
clock.tick() # 计时当前帧的处理时间,更新帧率
# 获取当前图像,并进行镜头畸变校正
img = sensor.snapshot().lens_corr(1.8) # 纠正镜头畸变,1.8是畸变系数,用于保证图像无畸变
# 颜色过滤:提取红色区域
# 使用颜色阈值过滤红色区域,返回的是一组与红色相匹配的区域(blobs)
# 这里使用了red_threshold来限制颜色范围,只识别红色区域,像素数阈值为100,区域最小面积为100
blobs = img.find_blobs(red_threshold, pixels_threshold=100, area_threshold=100, merge=True)
# 对每个找到的红色区域进行处理
for blob in blobs:
# blob.rect 是该颜色区域的边界矩形,格式为 (x, y, w, h)
# x, y是矩形的左上角坐标,w是宽度,h是高度
# 在该颜色区域内进一步进行形状检测(如圆形)
area = (blob.x(), blob.y(), blob.w(), blob.h()) # 获取区域的矩形边界框
# 获取该区域内的颜色统计信息(统计颜色分布),帮助分析区域内的颜色均衡
# stats 变量包含了图像区域内的平均色调等信息
statistics = img.get_statistics(roi=area) # 获取区域内颜色的统计信息
#print(statistics) # 打印该区域的颜色统计信息,便于调试和查看
# 对颜色区域进行更严格的圆形检测
# 使用霍夫变换查找圆形(基于该区域的边界框)
circles = img.find_circles(
threshold=2500, # 设置圆形检测的阈值,较高的值意味着更明显的圆形才能被检测到
x_margin=10, # 圆心的X坐标允许的误差范围
y_margin=10, # 圆心的Y坐标允许的误差范围
r_margin=10, # 圆半径的允许误差范围
r_min=2, # 圆的最小半径(像素),根据需求可以调整
r_max=100, # 圆的最大半径(像素),根据需求可以调整
r_step=2 # 圆半径变化的步长(像素)
)
# 检查霍夫变换返回的圆形列表
# circles是一个包含多个圆的列表,每个圆有圆心坐标(x, y)和半径r
for c in circles:
# 检查圆形的检测结果是否确实位于红色区域内,避免误判
# 判断该圆的中心是否位于红色区域的矩形内
if blob.x() <= c.x() <= blob.x() + blob.w() and blob.y() <= c.y() <= blob.y() + blob.h():
# 如果检测到圆形且圆形位于红色区域内,绘制圆框
img.draw_circle(c.x(), c.y(), c.r(), color=(192, 255, 0)) # 用绿色绘制圆形
print("Circle found: x = {}, y = {}, radius = {}".format(c.x(), c.y(), c.r()))
else:
# 如果圆形不在红色区域内,绘制白色圆框
img.draw_circle(c.x(), c.y(), c.r(), color=(255, 255, 255)) # 白色
# 打印当前帧率(每秒帧数),便于调试性能
# FPS表示每秒处理的帧数,是衡量图像处理效率的标准
print("FPS %f" % clock.fps()) # 输出当前的帧率(每秒帧数),以便调试图像处理速度
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)