【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测
项目测试实验代码
- #【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测
-
- # 导入必要的模块 Import required modules
- import time, os, sys
- from media.sensor import *
- from media.display import *
- from media.media import *
-
- # 图像分辨率设置 Image resolution settings
- PICTURE_WIDTH = 400 # 图像处理宽度
- PICTURE_HEIGHT = 240 # 图像处理高度
-
- # 摄像头配置 Camera configuration
- sensor = None
-
- # 显示模式选择 Display mode selection
- # 可选: "VIRT"(虚拟显示), "LCD"(物理屏幕)
- # Options: "VIRT"(Virtual Display), "LCD"
- DISPLAY_MODE = "LCD"
-
- # 根据显示模式设置分辨率 Set resolution based on display mode
- if DISPLAY_MODE == "VIRT":
- # 虚拟显示模式:1920x1080,16字节对齐
- DISPLAY_WIDTH = ALIGN_UP(1920, 16) # 对齐到16的倍数,优化内存访问
- DISPLAY_HEIGHT = 1080
- elif DISPLAY_MODE == "LCD":
- # 物理LCD显示模式:640x480
- DISPLAY_WIDTH = 640
- DISPLAY_HEIGHT = 480
- else:
- raise ValueError("Unknown DISPLAY_MODE, please select 'VIRT', 'LCD'")
-
- # 创建时钟对象用于FPS计算 Create clock object for FPS calculation
- clock = time.clock()
-
- try:
- # 初始化摄像头 Initialize camera
- sensor = Sensor() # 创建传感器对象
- sensor.reset() # 重置摄像头到默认状态
-
- # 设置图像分辨率和格式 Set image resolution and format
- # 使用通道0,设置400x240分辨率
- sensor.set_framesize(width=PICTURE_WIDTH, height=PICTURE_HEIGHT, chn=CAM_CHN_ID_0)
- # 设置像素格式为RGB565(16位彩色)
- sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)
-
- # 初始化显示器 Initialize display
- if DISPLAY_MODE == "VIRT":
- # 虚拟显示初始化,60FPS刷新率
- Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
- elif DISPLAY_MODE == "LCD":
- # 物理LCD初始化,同时输出到IDE便于调试
- Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
-
- # 初始化媒体管理器 Initialize media manager
- MediaManager.init() # 初始化媒体处理资源
- sensor.run() # 启动摄像头采集
-
- # 主循环 - 实时矩形检测
- while True:
- os.exitpoint() # 检查退出点,响应程序终止信号
- clock.tick() # 开始计时,用于FPS计算
-
- # 捕获图像 Capture image
- img = sensor.snapshot(chn=CAM_CHN_ID_0)
-
- print("【矩形信息 Line Statistics Start】")
-
- # 矩形检测核心算法
- # find_rects(threshold=8000): 在图像中查找矩形
- # threshold: 检测阈值,值越大要求矩形的轮廓越明显
- for r in img.find_rects(threshold=8000):
- # 绘制矩形边框:天蓝色,线宽2像素
- img.draw_rectangle(r.rect(), color=(40, 167, 225), thickness=2)
-
- # 绘制矩形角点:深绿色,半径8像素的圆点
- for p in r.corners():
- img.draw_circle(p[0], p[1], 8, color=(78, 90, 34))
-
- # 打印矩形详细信息
- print(r)
-
- print("【==============================】")
-
- # 显示FPS Display FPS
- print(f"FPS: {clock.fps()}")
-
- # 居中显示图像 Display image centered
- # 计算居中位置,使400x240图像在640x480屏幕上居中显示
- x = int((DISPLAY_WIDTH - PICTURE_WIDTH) / 2) # 水平居中:(640-400)/2 = 120
- y = int((DISPLAY_HEIGHT - PICTURE_HEIGHT) / 2) # 垂直居中:(480-240)/2 = 120
- Display.show_image(img, x=x, y=y)
-
- except KeyboardInterrupt as e:
- # 处理键盘中断(Ctrl+C)
- print("User Stop: ", e)
- except BaseException as e:
- # 处理其他所有异常
- print(f"Exception: {e}")
- finally:
- # 清理资源 Cleanup resources
- if isinstance(sensor, Sensor):
- sensor.stop() # 停止摄像头采集
- Display.deinit() # 关闭显示驱动
- os.exitpoint(os.EXITPOINT_ENABLE_SLEEP) # 启用睡眠模式
- time.sleep_ms(100) # 短暂延时确保资源释放完成
- MediaManager.deinit() # 释放媒体资源
复制代码
代码解读:
程序总体功能
这是一个基于CanMV K230的实时矩形检测系统,能够在视频流中实时识别图像中的矩形轮廓,并用可视化的方式标记出来。
系统架构设计
核心处理流程
text
摄像头采集(400×240) → 矩形检测算法 → 轮廓绘制 + 角点标记 → 居中显示 → 性能监控
1. 分辨率策略
python
- PICTURE_WIDTH = 400 # 处理分辨率
- PICTURE_HEIGHT = 240
-
- DISPLAY_WIDTH = 640 # 显示分辨率 (LCD模式)
- DISPLAY_HEIGHT = 480
复制代码
设计理念:
处理分辨率:400×240 - 平衡检测精度和计算效率
显示分辨率:640×480 - 提供清晰的视觉输出
居中显示:在小分辨率处理,大分辨率显示
核心技术组件详解
1. 多显示模式支持
python
- DISPLAY_MODE = "LCD" # 可选 "LCD" 或 "VIRT"
复制代码
两种模式对比:
LCD模式:物理屏幕显示,to_ide=True支持IDE调试
VIRT模式:虚拟显示,1920×1080分辨率,适合开发调试
2. 矩形检测核心算法
python
- for r in img.find_rects(threshold=8000):
复制代码
算法深度解析:
find_rects():基于轮廓检测的矩形查找算法
threshold=8000:轮廓质量阈值
高阈值:只检测轮廓清晰、完整的矩形
低阈值:检测更多可能矩形,但包含噪声
检测原理:
边缘检测提取轮廓
多边形近似找到四边形
几何约束验证矩形特性
阈值过滤确保轮廓质量
3. 矩形对象结构
python
- r.rect() # 返回矩形边界框: (x, y, width, height)
- r.corners() # 返回四个角点坐标: [(x1,y1), (x2,y2), (x3,y3), (x4,y4)]
复制代码
4. 可视化渲染系统
python
- # 绘制矩形边框 - 天蓝色,2像素线宽
- img.draw_rectangle(r.rect(), color=(40, 167, 225), thickness=2)
-
- # 绘制角点标记 - 深绿色,8像素半径圆点
- for p in r.corners():
- img.draw_circle(p[0], p[1], 8, color=(78, 90, 34))
复制代码
视觉设计:
边框颜色:天蓝色(40,167,225) - 醒目但不刺眼
角点标记:深绿色(78,90,34) - 突出关键特征点
双重标记:边框+角点提供完整的几何信息
性能优化策略
1. 分辨率优化
text
处理像素: 400 × 240 = 96,000
显示像素: 640 × 480 = 307,200
计算量减少: 约68% (相比直接处理640×480)
2. 居中显示算法
python
- x = (DISPLAY_WIDTH - PICTURE_WIDTH) / 2 # (640-400)/2 = 120
- y = (DISPLAY_HEIGHT - PICTURE_HEIGHT) / 2 # (480-240)/2 = 120
复制代码
自动计算居中位置
保持图像在显示中心
适应不同分辨率组合
3. 性能监控
python
- clock = time.clock()
- clock.tick() # 开始计时
- clock.fps() # 计算帧率
复制代码
实时监控处理性能
为算法调优提供数据支持
算法工作流程
主循环执行序列
图像捕获:从摄像头获取400×240分辨率帧
矩形检测:运行find_rects算法查找所有矩形
可视化绘制:为每个检测到的矩形绘制边框和角点
信息输出:打印矩形详细信息到控制台
居中显示:将处理后的图像居中显示在屏幕上
性能统计:计算并显示当前FPS
矩形检测详细流程
text
原始图像 → 边缘检测 → 轮廓提取 → 多边形近似 →
四边形过滤 → 矩形验证 → 阈值筛选 → 结果输出
异常处理与资源管理
三级保护机制
python
- try:
- # 主程序逻辑
- except KeyboardInterrupt: # 用户主动中断
- except BaseException: # 其他所有异常
- finally: # 强制资源清理
复制代码
资源释放顺序
停止传感器:sensor.stop()
关闭显示:Display.deinit()
系统睡眠:os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
释放媒体资源:MediaManager.deinit()
输出信息分析
控制台输出格式
text
【矩形信息 Line Statistics Start】
矩形对象详细信息...
【==============================】
FPS: 25.6
信息内容:
矩形位置、尺寸、角度等几何信息
实时处理帧率
结构化日志便于分析
应用场景分析
工业视觉检测
PCB板检测:识别电路板轮廓和定位孔
产品包装:检查包装盒形状和完整性
机械零件:定位零部件轮廓和特征
文档处理
文档扫描:自动检测文档边界
表格识别:定位表格区域
名片数字化:提取名片轮廓
机器人导航
环境理解:识别结构化环境中的矩形物体
目标定位:为抓取操作提供位置信息
路径规划:避开矩形障碍物
增强现实
标记识别:检测AR标记矩形边框
空间锚点:基于矩形特征建立空间参考
技术优势
1. 算法鲁棒性
阈值可调适应不同场景
几何约束确保检测质量
多重验证减少误检
2. 实时性能
优化的分辨率选择
高效的轮廓处理算法
硬件加速的图像处理
3. 用户体验
清晰的可视化反馈
实时性能监控
灵活的运行模式
4. 系统稳定性
完整的异常处理
安全的资源管理
优雅的程序退出
参数调优指南
阈值调整
python
- # 高噪声环境 - 提高阈值
- threshold = 10000
-
- # 需要高灵敏度 - 降低阈值
- threshold = 5000
复制代码
分辨率调整
python
- # 更高精度检测
- PICTURE_WIDTH = 640
- PICTURE_HEIGHT = 480
-
- # 更高处理速度
- PICTURE_WIDTH = 320
- PICTURE_HEIGHT = 240
复制代码
总结
这个矩形检测系统体现了嵌入式计算机视觉的工程最佳实践:
性能与质量的平衡:通过分辨率策略优化处理效率
完整的视觉反馈:边框+角点的双重标记提供丰富信息
稳健的系统架构:异常处理和资源管理确保长期稳定运行
实用的检测算法:基于轮廓的矩形检测满足实际应用需求
灵活的可配置性:支持多种显示模式和参数调整
代码结构清晰,功能完整,既是可立即使用的矩形检测工具,也是学习嵌入式视觉开发的优秀教学范例。
|