当前位置: 首页 > news >正文

《K230 从熟悉到...》圆形检测

《K230 从熟悉到...》圆形检测

  • 设定圆形检测,满足条件报警

《庐山派 K230 从熟悉到...》圆形检测

可以用来快速定位圆心与半径,可以用来检测圆环标记,交通标志等,也可以用于物体检测(如五子棋棋子定位)。
我们有了线段检测和矩形检测的基础后,圆形检测就很好整了。直接看效果

所使用API

find_circles

该函数使用霍夫变换在图像中查找圆形,并返回一个 image.circle 对象的列表。

在这里插入图片描述

import time, os, sys

from media.sensor import *
from media.display import *
from media.media import *

sensor = None
fps = time.clock()
try:


    sensor = Sensor()
    sensor.reset()

    sensor.set_framesize(width = 800, height = 480)
    sensor.set_pixformat(Sensor.YUV420SP)
    bind_info = sensor.bind_info()
    Display.bind_layer(**bind_info, layer = Display.LAYER_VIDEO1)

    # 通道2  320*240
    sensor.set_framesize(Sensor.QVGA, chn = CAM_CHN_ID_2)
    sensor.set_pixformat(Sensor.RGB565, chn = CAM_CHN_ID_2)

    
    Display.init(Display.ST7701)
    MediaManager.init()
    sensor.run()
    fps = time.clock()
    # 注意他们2个显示都不在一个层上面!!!
    while True:
        fps.tick()
       
        os.exitpoint()
      
        img = sensor.snapshot(chn = CAM_CHN_ID_2)
        circles = img.find_circles(threshold=4000)
        count = 0  # 初始化线段计数器

        print("------圆形统计开始------")
        for circle in circles:
             # 若想获取更详细的四个顶点,可使用 rect.corners(),该函数会返回一个有四个元祖的列表,每个元组代表圆形的四个顶点,从左上角开始,按照顺时针排序。
            img.draw_circle(circle.circle(), color=(1, 147, 230), thickness=3)  # 绘制线段
            print(f"Circle {count}: {circle}")  # 打印线段信息
            count += 1  # 更新计数器
        print("---------END---------")
        Display.show_image(img, x = 800-320, layer = Display.LAYER_OSD1)
        print(fps.fps())
        
        
except KeyboardInterrupt as e:
    print("user stop: ", e)
except BaseException as e:
    print(f"Exception {e}")
finally:
    # sensor stop run
    if isinstance(sensor, Sensor):
        sensor.stop()
    # deinit display
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    # release media buffer
    MediaManager.deinit()

image.circle

最后一个返回值就是之前说的索贝尔滤波像素
在这里插入图片描述
我们看第三个返回值 r 在列表中用[2]来查找
在这里插入图片描述

我们来看看添加的条件。当半径大于55,蜂鸣器响一下。很简单吧0 0。

设定圆形检测,满足条件报警

import time, os, sys

from media.sensor import *
from media.display import *
from media.media import *
from machine import PWM, FPIOA
sensor = None
fps = time.clock()
# 配置蜂鸣器IO口功能
beep_io = FPIOA()
beep_io.set_function(43, FPIOA.PWM1)
beep_pwm = PWM(1, 4000, 50, enable=False)  # 默认频率4kHz,占空比50%
# 初始化蜂鸣器PWM通道


try:
    sensor = Sensor()
    sensor.reset()

    sensor.set_framesize(width = 800, height = 480)
    sensor.set_pixformat(Sensor.YUV420SP)
    bind_info = sensor.bind_info()
    Display.bind_layer(**bind_info, layer = Display.LAYER_VIDEO1)

    # 通道2  320*240
    sensor.set_framesize(Sensor.QVGA, chn = CAM_CHN_ID_2)
    sensor.set_pixformat(Sensor.RGB565, chn = CAM_CHN_ID_2)

    
    Display.init(Display.ST7701)
    MediaManager.init()
    sensor.run()
    fps = time.clock()
    # 注意他们2个显示都不在一个层上面!!!
    while True:
        fps.tick()
       
        os.exitpoint()
      
        img = sensor.snapshot(chn = CAM_CHN_ID_2)
        circles = img.find_circles(threshold=3000)
        count = 0  # 初始化线段计数器

        print("------圆形统计开始------")
        for circle in circles:
             # 若想获取更详细的四个顶点,可使用 rect.corners(),该函数会返回一个有四个元祖的列表,每个元组代表圆形的四个顶点,从左上角开始,按照顺时针排序。
            img.draw_circle(circle.circle(), color=(1, 147, 230), thickness=3)  # 绘制线段
            if int(circle.circle()[2])>55:
                beep_pwm.enable(1)
                # 延时50ms
                time.sleep_ms(50)
                beep_pwm.enable(0)

            #print(f"Circle {count}: {circle}")  # 打印线段信息
            count += 1  # 更新计数器
        print("---------END---------")
        Display.show_image(img, x = 800-320, layer = Display.LAYER_OSD1)
        print(fps.fps())
        
        
except KeyboardInterrupt as e:
    print("user stop: ", e)
except BaseException as e:
    print(f"Exception {e}")
finally:
    # sensor stop run
    if isinstance(sensor, Sensor):
        sensor.stop()
    # deinit display
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    # release media buffer
    MediaManager.deinit()

线段检测和矩形检测一样可以用,哈。有了圆形检测的经验小伙伴可以回头去自己改一下。来看代码,关于蜂鸣器,小伙伴自行去查看。

相关文章:

  • 推荐系统(二十):TensorFlow 中的两种范式 tf.keras.Model 和 tf.estimator.Estimator
  • playwright解决重复登录问题,通过pytest夹具自动读取storage_state用户状态信息
  • 【深度学习】不管理论,入门从手写数字识别开始
  • Vue3 其它API Teleport 传送门
  • 【多线程】进阶
  • 数据安全系列4:密码技术的应用-接口调用的身份识别
  • 【操作系统】内存管理: Buddy算法与Slab算法详解
  • Nginx — 高可用部署(Keepalived+Nginx)
  • 解决 Android AGP 最新版本中 BuildConfig 报错问题
  • string的基本使用
  • 机器学习课程
  • 解决pyinstaller GUI打包时无法打包图片问题
  • 解构需求管理:全流程与多维度策略
  • wait和notify : 避免线程饿死(以及votile内存可见性和指令重排序问题)
  • 保存中断上下文
  • 更高的效率——MyBatis-plus
  • uniapp 获取dom信息(封装获取元素信息工具函数)
  • 多线程的三种实现方式
  • 基于单片机的智能奶茶机(论文 +源码)
  • 【ESP32】ESP32与MQTT通信:实现传感器数据监测与设备控制
  • 罗庄区建设局网站/青岛seo杭州厂商
  • 网站开发者排名/谷歌推广培训
  • 做网站需要哪些资料/搜索引擎优化的主要手段
  • 网站策划的最终体现/百度代运营公司
  • 自助建站哪个网站好/网站自助建站系统
  • 和网站建设相关的行业/2023年7 8月十大新闻