线段检测

线段检测例程实验效果简介代码讲解完整代码代码讲解检测线段find_line_segments霍夫变换

例程实验效果简介

本节例程代码位于:【源码汇总 / 04.Detecting / 01.find_lines】

我们用CanMV IDE打开例程代码,将K230用USB连接到电脑上

点击CanMV IDE左下角的运行按钮,

将K230的摄像头对准线段

可以看到屏幕上会标记出画面中的线段(如果没有屏幕就看帧缓冲区)

原图:

image-20250211100907523

K230识别结果:

image-20250211101012471

 

代码讲解

本节我们要用的的外设主要是摄像头模块

线段检测由 K230中的 find_line_segments() 方法实现,该方法属于image模块

例程使用的代码如下:

完整代码

*以【源码汇总 / 04.Detecting / 01.find_lines.py】文件内容为准

代码讲解

本节代码的基本结构如下

导入和初始化部分:

scale_coordinates函数:

图像处理Pipeline设置:

主循环处理:

这一节代码中,我们没有使用更常规的方式去做线段检测,而是借助K230支持多个图层的特性

用较低的分辨率去检测图形,然后放缩结果到高分辨的背景图像中

这样操作后,程序运行的帧率会显著的增高

本章后续的所有代码则用的是原始的检测方法,代码会更简单,但是帧率会降低不少

检测线段

find_line_segments

使用霍夫转换来查找图像中的线段。返回一个 image.line 对象的列表。

roi 是一个用以复制的矩形的感兴趣区域(x, y, w, h)。如果未指定, ROI 即图像矩形。操作范围仅限于roi区域内的像素。

merge_distance 指定两条线段之间的可以相互分开而不被合并的最大像素数。

max_theta_difference 是上面 merge_distancede 要合并的的两个线段的最大角度差值。

此方法使用LSD库(也被OpenCV使用)来查找图像中的线段。这有点慢,但是非常准确,线段不会跳跃。

不支持压缩图像和bayer图像。

 

霍夫变换

霍夫变换是一种从图像中检测直线、圆等几何形状的数学方法。

打个比方,想象你面前有一张散落着很多点的图纸。

如果要找出这些点能组成的直线:

  1. 传统方法是尝试连接任意两点看是否能形成直线,这样很费时
  2. 霍夫变换的思路是反过来 - 对每个点,假设它可能在无数条直线上,找到多个点共同落在的那条直线

举个生活中的例子:你站在路边看电线杆,虽然电线杆分布在不同位置,但是你一眼就能看出它们排成了一条直线。这就类似霍夫变换的原理。

实际应用

算法步骤