微信最火公众号排行优化关键词的方法有哪些
《K230 从熟悉到...》圆形检测
- 设定圆形检测,满足条件报警
《庐山派 K230 从熟悉到...》圆形检测
可以用来快速定位圆心与半径,可以用来检测圆环标记,交通标志等,也可以用于物体检测(如五子棋棋子定位)。
我们有了线段检测和矩形检测的基础后,圆形检测就很好整了。直接看效果
所使用API
find_circles
该函数使用霍夫变换在图像中查找圆形,并返回一个 image.circle
对象的列表。
import time, os, sysfrom 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*240sensor.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 runif isinstance(sensor, Sensor):sensor.stop()# deinit displayDisplay.deinit()os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)time.sleep_ms(100)# release media bufferMediaManager.deinit()
image.circle
最后一个返回值就是之前说的索贝尔滤波像素
我们看第三个返回值 r 在列表中用[2]来查找
我们来看看添加的条件。当半径大于55,蜂鸣器响一下。很简单吧0 0。
设定圆形检测,满足条件报警
import time, os, sysfrom 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*240sensor.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)# 延时50mstime.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 runif isinstance(sensor, Sensor):sensor.stop()# deinit displayDisplay.deinit()os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)time.sleep_ms(100)# release media bufferMediaManager.deinit()
线段检测和矩形检测一样可以用,哈。有了圆形检测的经验小伙伴可以回头去自己改一下。来看代码,关于蜂鸣器,小伙伴自行去查看。