• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

3.4.6-识别形状+颜色+增加最小变化阈值+增加最大变化阈值 STM32串口通信

03/20 08:44
371
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

联系方式.txt

共1个文件

非常详细的视频和文字教程,讲解常见的openmv教程包括 巡线、物体识别、圆环识别、阈值自动获取等。非常适合学习openmv、K210、K230等项目
视频合集链接在:


openmv教程合集 openmv入门到项目开发 openmv和STM32通信 openmv和opencv区别 openmv巡线 openmv数字识别教程LCD

3.4.6-识别形状+颜色+增加最小变化阈值+增加最大变化阈值

增加最大变化阈值来解决半径识别错误,经常出现识别很大半径

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),用于识别红色
color_threshold = (0, 100, 0, 127, 0, 127)

# 初始化摄像头模块
sensor.reset()  # 重置摄像头,确保设备正常工作
sensor.set_pixformat(sensor.RGB565)  # 设置摄像头的像素格式为RGB565
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()

# *************************** 最小变化阈值滤波 **************************    
# 位置和半径变化阈值
position_threshold = 4  # 位置变化的最小阈值
radius_threshold = 4    # 半径变化的最小阈值
MAX_CHANGE_THRESHOLD = 80  # 最大变化阈值(例如位置或半径变化超过此值时不更新)

# 上一帧的圆心坐标和半径
prev_x, prev_y, prev_r = None, None, None
# *************************** 最小变化阈值滤波 **************************

# 主循环,不断获取摄像头图像并进行处理
while True:
    clock.tick()  # 计时当前帧的处理时间

    # 获取当前图像并进行镜头畸变校正
    img = sensor.snapshot().lens_corr(1.8)

    # 使用霍夫变换查找圆形
    for c in 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         # 圆半径变化步长
    ):
        # 计算圆形的外接矩形区域
        area = (c.x() - c.r(), c.y() - c.r(), 2 * c.r(), 2 * c.r())  # (x, y, width, height)
        statistics = img.get_statistics(roi=area)

        # 判断该区域是否为红色圆
        if (
            color_threshold[0] < statistics.l_mode() < color_threshold[1] and
            color_threshold[2] < statistics.a_mode() < color_threshold[3] and
            color_threshold[4] < statistics.b_mode() < color_threshold[5]
        ):
            # 获取当前圆心和半径
            x, y, r = c.x(), c.y(), c.r()

            # 如果是第一次检测,更新值
            if prev_x is None or prev_y is None or prev_r is None:
                prev_x, prev_y, prev_r = x, y, r
                img.draw_circle(x, y, r, color=(192, 255, 0))  # 绘制圆形

            else:
                # 计算变化量
                x_change = abs(x - prev_x)
                y_change = abs(y - prev_y)
                r_change = abs(r - prev_r)

                # 判断变化是否大于最小阈值,并且变化小于最大阈值
                if (
                    (x_change > position_threshold or y_change > position_threshold or r_change > radius_threshold) and
                    (x_change <= MAX_CHANGE_THRESHOLD and y_change <= MAX_CHANGE_THRESHOLD and r_change <= MAX_CHANGE_THRESHOLD)
                ):
                    # 变化大于最小阈值且不超过最大阈值,更新值
                    prev_x, prev_y, prev_r = x, y, r
                    img.draw_circle(x, y, r, color=(192, 255, 0))
                    print("Circle found: x = {}, y = {}, radius = {}".format(x, y, r))
                else:
                    # 变化小于阈值,绘制上次的坐标和半径
                    img.draw_circle(prev_x, prev_y, prev_r, color=(192, 255, 0))
                    print("Circle found: x = {}, y = {}, radius = {}".format(prev_x, prev_y, prev_r))

        else:
            # 如果不是红色圆形,用白色矩形框标记该区域
            img.draw_circle(c.x(), c.y(), c.r(), color=(255, 255, 255))  # 白色

    # 打印当前帧率
    print("FPS %f" % clock.fps())

  • 联系方式.txt
    下载
点赞
收藏
评论
分享
加入交流群
举报

相关推荐