《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()
线段检测和矩形检测一样可以用,哈。有了圆形检测的经验小伙伴可以回头去自己改一下。来看代码,关于蜂鸣器,小伙伴自行去查看。