线段检测实验
前言
在上一章节中,已经了解了如何在CanMV下使用image模块实现直线检测的方法,本章将通过线段检测实验,介绍如何使用CanMV的find_line_segments()方法实现线段检测功能。在本实验中,我们将摄像头捕获的图像进行处理,查找图像中所有物体的线段,并将结果绘制并显示到显示器上。通过本章的学习,读者将学习到如何在CanMV下使用find_line_segments()方法实现线段检测的功能。
Image模块介绍
概述
Image 类是机器视觉处理中的基础对象。此类支持从Micropython GC、MMZ、系统堆、VB区域等内存区域创建图像对象。此外,还可以通过引用外部内存直接创建图像(ALLOC_REF)。未使用的图像对象会在垃圾回收时自动释放,也可以手动释放内存。
支持的图像格式如下:
- BINARY
- GRAYSCALE
- RGB565
- BAYER
- YUV422
- JPEG
- PNG
- ARGB8888(新增)
- RGB888(新增)
- RGBP888(新增)
- YUV420(新增)
支持的内存分配区域:
- ALLOC_MPGC:Micropython管理的内存
- ALLOC_HEAP:系统堆内存
- ALLOC_MMZ:多媒体内存
- ALLOC_VB:视频缓冲区
- ALLOC_REF:使用引用对象的内存,不分配新内存
API描述
Python中的Image模块是一个强大的图像处理工具,它提供了一系列函数和方法,可以用于图像元素绘制、图像滤波、图像特征检测、色块追踪、图像对比和码识别等。由于image模块功能强大,需要介绍的内容也比较多,因此本章仅介绍image模块中find_line_segments函数的使用。
find_line_segments
image.find_line_segments([roi[, merge_distance=0[, max_theta_difference=15]]])
该函数使用霍夫变换查找图像中的线段,并返回一个image.line对象的列表。
【参数】
- roi:为感兴趣区域的矩形元组(x, y, w, h)。若未指定,ROI默认为整个图像的矩形。操作仅限于该区域内的像素。
- merge_distance:指定两条线段之间的最大像素距离,若小于该值则合并为一条线段。
- max_theta_difference:为需合并的两条线段之间的最大角度差。
该方法使用LSD库(OpenCV亦采用)来查找图像中的线段。虽然速度较慢,但准确性高,且线段不会出现跳跃现象。
注意:此功能不支持压缩图像和Bayer图像。
更多用法请阅读官方API手册:
硬件设计
例程功能
- 获取摄像头输出的图像,并使用image模块的find_line_segments()方法查找图像上所有线段并绘制出来,最后将图像显示在LCD上。
硬件资源
- 本章实验内容,主要讲解image模块的使用,无需关注硬件资源。