【CanMV K230】线段检测
- 什么是线段检测
- 线段检测应用领域
- 1.地图解析中的道路、建筑轮廓提取
- 2.计算机视觉中的物体识别和跟踪。
- 3.机器人导航和环境理解。
- 4.图像分割和特征点提取。
- 5.建筑测量和图像重建。
- 6.OCR(光学字符识别)预处理。
- 7.行人检测和交通标志识别。
- 8.高铁电机机车顶部图像检测系统,如受电弓检测程序。
- 9,遥感图像中几何形状明显的目标检测。
- K230应用
- 函数
- 例程
本篇内容:
- 什么是线段检测
- 线段检测应用领域
- K230应用(包含相应函数及例程)
B站视频链接:已做成合集 (求去点赞,或者)
抖音链接:已做成合集
什么是线段检测
线段检测是图像处理领域中的一项技术,它涉及到识别和定位图像中的直线段。线段检测算法的目的是从数字图像中提取线性结构,这些结构可以是实际的物理线条,也可以是图像中的边缘或轮廓。
线段检测应用领域
线段检测技术在多个领域都有应用,主要包括:
1.地图解析中的道路、建筑轮廓提取
2.计算机视觉中的物体识别和跟踪。
3.机器人导航和环境理解。
4.图像分割和特征点提取。
5.建筑测量和图像重建。
建筑测量
6.OCR(光学字符识别)预处理。
7.行人检测和交通标志识别。
8.高铁电机机车顶部图像检测系统,如受电弓检测程序。
9,遥感图像中几何形状明显的目标检测。
这些应用展示了线段检测在自动化、机器视觉、地理信息系统和安全监控等领域的重要性和多功能性。
K230应用
函数
find_line_segments对象
构造函数
image.find_line_segments([roi[, merge_distance=0[, max_theta_difference=15]]])
线段识别函数。返回一个 image.line 线段对象列表。
参数 | 说明 |
---|---|
roi: | 识别区域(x,y,w,h),未指定则默认整张图片。 |
merge_distance | 两条线段间可以相互分开而不被合并的最大像素; |
max_theta_differenc | 将少于这个角度值的线段合并。 |
例程
'''
实验名称:线段检测
实验平台:01Studio CanMV K230
教程:wiki.01studio.cc
说明:推荐使用320x240以下分辨率,分辨率过大会导致帧率下降。
'''
import time, os, sys
from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口
enable_lens_corr = False # 设为True可以获得更直的线段
try:
sensor = Sensor(width=1280, height=960) #构建摄像头对象,将摄像头长宽设置为4:3
sensor.reset() #复位和初始化摄像头
sensor.set_framesize(width=320, height=240) #设置帧大小,默认通道0
sensor.set_pixformat(Sensor.RGB565) #设置输出图像格式,默认通道0
Display.init(Display.ST7701, to_ide=True) #同时使用3.5寸mipi屏和IDE缓冲区显示图像,800x480分辨率
#Display.init(Display.VIRT, sensor.width(), sensor.height()) #只使用IDE缓冲区显示图像
MediaManager.init() #初始化media资源管理器
sensor.run() #启动sensor
clock = time.clock()
while True:
os.exitpoint() #检测IDE中断
################
## 这里编写代码 ##
################
clock.tick()
img = sensor.snapshot() #拍摄一张图片
if enable_lens_corr: img.lens_corr(1.8) # for 2.8mm lens...
# `merge_distance` 控制相近的线段是否合并. 数值 0 (默认值)表示不合并。数值
#为1时候表示相近1像素的线段被合并。因此你可以通过改变这个参数来控制检测到线
#段的数量。
# `max_theta_diff` 控制相差一定角度的线段合并,默认是15度,表示15度内的线
# 段都会合并
for l in img.find_line_segments(merge_distance = 0, max_theta_diff = 5):
img.draw_line(l.line(), color = (255, 0, 0), thickness=2)
print(l)
#Display.show_image(img) #显示图片
#显示图片,仅用于LCD居中方式显示
Display.show_image(img, x=round((800-sensor.width())/2),y=round((480-sensor.height())/2))
print(clock.fps()) #打印FPS
###################
# IDE中断释放资源代码
###################
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()
'''
实验名称:线段检测测试
实验平台:01Studio CanMV K230
说明:实现图像在HDMI显示器进行线段检测
测试人:咸鱼浆 2024年9月6日21:02:15
'''
import time, os, sys
from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口
enable_lens_corr = False # 设为True可以获得更直的线段
try:
sensor = Sensor(width=1280, height=960) #构建摄像头对象,将摄像头长宽设置为4:3
sensor.reset() #复位和初始化摄像头
sensor.set_framesize(width=640, height=480) #设置帧大小为(width=640, height=480)太大了就显示不出来了,默认通道0
sensor.set_pixformat(Sensor.RGB565) #设置输出图像格式,默认通道0
#使用IDE缓冲区输出图像,显示尺寸和sensor配置一致。
Display.init(Display.LT9611, to_ide=True)
MediaManager.init() #初始化media资源管理器
sensor.run() #启动sensor
while True:
os.exitpoint() #检测IDE中断
################
## 这里编写代码 ##
################
img = sensor.snapshot() #拍摄一张图
#使用 Canny 边缘检测器
if enable_lens_corr: img.lens_corr(1.8) # for 2.8mm lens...
# `merge_distance` 控制相近的线段是否合并. 数值 0 (默认值)表示不合并。数值
#为1时候表示相近1像素的线段被合并。因此你可以通过改变这个参数来控制检测到线
#段的数量。
# `max_theta_diff` 控制相差一定角度的线段合并,默认是15度,表示15度内的线
# 段都会合并
for l in img.find_line_segments(merge_distance = 0, max_theta_diff = 5):
img.draw_line(l.line(), color = (255, 0, 0), thickness=2)
print(l)
Display.show_image(img, x=round((1920-sensor.width())/2),y=round((1080-sensor.height())/2))
#Display.show_image(img) #显示图片
###################
# IDE中断释放资源代码
###################
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()