《K230 从熟悉到...》线段检测
线段检测是计算机视觉中的一个基本任务,它用于识别和定位图像中的线性特征。
常用于识别图像中的线段部分,为更高层次的视觉处理任务提供支持。常使用霍夫变换算法来实现。
庐山派所使用的 find_line_segments
接口即采用了 LSD 算法,与部分OpenCV版本一致,检测效果准确并且线段不易抖动或跳跃。
LSD是一种快速且精准的线段检测算法,它不需要任何参数调整,能够在各种尺度上有效检测线段。
《庐山派 K230 从熟悉到...》线段检测
。
我们只看实际效果
find_line_segments
image.find_line_segments([roi[, merge_distance=0[, max_theta_difference=15]]])
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)
lines = img.find_line_segments(merge_distance=20, max_theta_diff=10)
count = 0 # 初始化线段计数器
print("------线段统计开始------")
for line in lines:
img.draw_line(line.line(), color=(1, 147, 230), thickness=3) # 绘制线段
print(f"Line {count}: {line}") # 打印线段信息
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()