8浏览
查看: 8|回复: 3

[项目] 【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测

[复制链接]
【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图1

什么是 CanMV K230?
CanMV K230是一款高性价比的RISC-V边缘AI平台,凭借低功耗、强视觉处理能力和开放的开发生态,成为嵌入式AI开发的理想选择,尤其适合需要快速部署视觉与AI功能的创客、中小企业及教育场景。CanMV 是一套 AI 视觉开发平台,K230 是其核心芯片。该模块结合了图像采集、AI推理、边缘计算等能力,适合嵌入式视觉应用开发。

CanMV:类似 OpenMV 的图像处理框架,支持 Python 编程,简化视觉识别开发流程。
K230 芯片:嘉楠科技推出的 AIoT SoC,采用 RISC-V 架构,内置第三代 KPU(AI加速单元),算力高达 6 TOPS,性能是 K210 的 13.7 倍。


【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图2

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测

知识点
矩形检测是计算机视觉中基于线段检测的进阶任务,核心是从图像中识别满足 “四组对边平行、邻边垂直、四边闭合” 特征的四边形区域(如物体表面、文档边框、屏幕、包装盒),广泛依赖线段检测或轮廓分析实现。

1、核心原理
矩形的几何特征是检测的核心依据,主流实现路径有两种:
线段组合法:先检测图像中所有线段,再筛选出满足 “两两平行、邻边垂直、长度匹配、闭合连接” 的四组线段,组合成矩形。
轮廓拟合发:先提取图像轮廓(如通过 Canny 边缘检测 + 轮廓查找),再对轮廓进行多边形逼近,筛选出边数为 4、且邻边夹角接近 90° 的轮廓,即为矩形。

2、主流算法(按场景适配性分类)

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图4

3、实操示例(OpenCV 轮廓拟合实现)
适合快速落地,无需复杂预处理,适配多数简单场景:
python
  1. import cv2
  2. import numpy as np
  3. # 读取图像(可替换为K230摄像头采集帧)
  4. img = cv2.imread("document.jpg")
  5. img_copy = img.copy()
  6. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  7. # 图像预处理:降噪+边缘检测
  8. blur = cv2.GaussianBlur(gray, (5, 5), 0)
  9. canny = cv2.Canny(blur, 50, 150)
  10. # 查找轮廓(只保留外部轮廓)
  11. contours, _ = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  12. # 筛选矩形轮廓
  13. for cnt in contours:
  14.     # 多边形逼近(epsilon控制逼近精度,越小越接近原轮廓)
  15.     epsilon = 0.02 * cv2.arcLength(cnt, True)
  16.     approx = cv2.approxPolyDP(cnt, epsilon, True)
  17.    
  18.     # 筛选条件:边数为4 + 轮廓面积足够大(过滤噪声)
  19.     if len(approx) == 4 and cv2.contourArea(approx) > 1000:
  20.         # 验证邻边垂直(计算向量夹角,接近90°)
  21.         x1, y1 = approx[0][0]
  22.         x2, y2 = approx[1][0]
  23.         x3, y3 = approx[2][0]
  24.         vec1 = (x2-x1, y2-y1)
  25.         vec2 = (x3-x2, y3-y2)
  26.         dot = abs(vec1[0]*vec2[0] + vec1[1]*vec2[1])  # 点积,垂直时为0
  27.         if dot < 100:  # 允许微小偏差
  28.             # 绘制矩形(绿色边框,厚度2)
  29.             cv2.drawContours(img_copy, [approx], -1, (0, 255, 0), 2)
  30.             # 标注矩形顶点坐标
  31.             for (x, y) in approx[:, 0]:
  32.                 cv2.circle(img_copy, (x, y), 5, (255, 0, 0), -1)
  33. # 显示结果
  34. cv2.imshow("Rectangle Detection", img_copy)
  35. cv2.waitKey(0)
  36. cv2.destroyAllWindows()
复制代码

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图5
【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图1

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图3

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图2

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测
项目测试实验代码

  1. #【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测
  2. # 导入必要的模块 Import required modules
  3. import time, os, sys
  4. from media.sensor import *
  5. from media.display import *
  6. from media.media import *
  7. # 图像分辨率设置 Image resolution settings
  8. PICTURE_WIDTH = 400    # 图像处理宽度
  9. PICTURE_HEIGHT = 240   # 图像处理高度
  10. # 摄像头配置 Camera configuration
  11. sensor = None
  12. # 显示模式选择 Display mode selection
  13. # 可选: "VIRT"(虚拟显示), "LCD"(物理屏幕)
  14. # Options: "VIRT"(Virtual Display), "LCD"
  15. DISPLAY_MODE = "LCD"
  16. # 根据显示模式设置分辨率 Set resolution based on display mode
  17. if DISPLAY_MODE == "VIRT":
  18.     # 虚拟显示模式:1920x1080,16字节对齐
  19.     DISPLAY_WIDTH = ALIGN_UP(1920, 16)  # 对齐到16的倍数,优化内存访问
  20.     DISPLAY_HEIGHT = 1080
  21. elif DISPLAY_MODE == "LCD":
  22.     # 物理LCD显示模式:640x480
  23.     DISPLAY_WIDTH = 640
  24.     DISPLAY_HEIGHT = 480
  25. else:
  26.     raise ValueError("Unknown DISPLAY_MODE, please select 'VIRT', 'LCD'")
  27. # 创建时钟对象用于FPS计算 Create clock object for FPS calculation
  28. clock = time.clock()
  29. try:
  30.     # 初始化摄像头 Initialize camera
  31.     sensor = Sensor()      # 创建传感器对象
  32.     sensor.reset()         # 重置摄像头到默认状态
  33.     # 设置图像分辨率和格式 Set image resolution and format
  34.     # 使用通道0,设置400x240分辨率
  35.     sensor.set_framesize(width=PICTURE_WIDTH, height=PICTURE_HEIGHT, chn=CAM_CHN_ID_0)
  36.     # 设置像素格式为RGB565(16位彩色)
  37.     sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)
  38.     # 初始化显示器 Initialize display
  39.     if DISPLAY_MODE == "VIRT":
  40.         # 虚拟显示初始化,60FPS刷新率
  41.         Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
  42.     elif DISPLAY_MODE == "LCD":
  43.         # 物理LCD初始化,同时输出到IDE便于调试
  44.         Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
  45.     # 初始化媒体管理器 Initialize media manager
  46.     MediaManager.init()    # 初始化媒体处理资源
  47.     sensor.run()           # 启动摄像头采集
  48.     # 主循环 - 实时矩形检测
  49.     while True:
  50.         os.exitpoint()     # 检查退出点,响应程序终止信号
  51.         clock.tick()       # 开始计时,用于FPS计算
  52.         # 捕获图像 Capture image
  53.         img = sensor.snapshot(chn=CAM_CHN_ID_0)
  54.         print("【矩形信息 Line Statistics Start】")
  55.         # 矩形检测核心算法
  56.         # find_rects(threshold=8000): 在图像中查找矩形
  57.         # threshold: 检测阈值,值越大要求矩形的轮廓越明显
  58.         for r in img.find_rects(threshold=8000):
  59.             # 绘制矩形边框:天蓝色,线宽2像素
  60.             img.draw_rectangle(r.rect(), color=(40, 167, 225), thickness=2)
  61.             
  62.             # 绘制矩形角点:深绿色,半径8像素的圆点
  63.             for p in r.corners():
  64.                 img.draw_circle(p[0], p[1], 8, color=(78, 90, 34))
  65.             
  66.             # 打印矩形详细信息
  67.             print(r)
  68.         
  69.         print("【==============================】")
  70.         # 显示FPS Display FPS
  71.         print(f"FPS: {clock.fps()}")
  72.         # 居中显示图像 Display image centered
  73.         # 计算居中位置,使400x240图像在640x480屏幕上居中显示
  74.         x = int((DISPLAY_WIDTH - PICTURE_WIDTH) / 2)  # 水平居中:(640-400)/2 = 120
  75.         y = int((DISPLAY_HEIGHT - PICTURE_HEIGHT) / 2) # 垂直居中:(480-240)/2 = 120
  76.         Display.show_image(img, x=x, y=y)
  77. except KeyboardInterrupt as e:
  78.     # 处理键盘中断(Ctrl+C)
  79.     print("User Stop: ", e)
  80. except BaseException as e:
  81.     # 处理其他所有异常
  82.     print(f"Exception: {e}")
  83. finally:
  84.     # 清理资源 Cleanup resources
  85.     if isinstance(sensor, Sensor):
  86.         sensor.stop()          # 停止摄像头采集
  87.     Display.deinit()           # 关闭显示驱动
  88.     os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)  # 启用睡眠模式
  89.     time.sleep_ms(100)         # 短暂延时确保资源释放完成
  90.     MediaManager.deinit()      # 释放媒体资源
复制代码


代码解读:
程序总体功能
这是一个基于CanMV K230的实时矩形检测系统,能够在视频流中实时识别图像中的矩形轮廓,并用可视化的方式标记出来。

系统架构设计
核心处理流程
text
摄像头采集(400×240) → 矩形检测算法 → 轮廓绘制 + 角点标记 → 居中显示 → 性能监控
1. 分辨率策略
python
  1. PICTURE_WIDTH = 400    # 处理分辨率
  2. PICTURE_HEIGHT = 240
  3. DISPLAY_WIDTH = 640    # 显示分辨率 (LCD模式)
  4. DISPLAY_HEIGHT = 480
复制代码


设计理念:
处理分辨率:400×240 - 平衡检测精度和计算效率
显示分辨率:640×480 - 提供清晰的视觉输出
居中显示:在小分辨率处理,大分辨率显示

核心技术组件详解
1. 多显示模式支持
python
  1. DISPLAY_MODE = "LCD"  # 可选 "LCD" 或 "VIRT"
复制代码


两种模式对比:
LCD模式:物理屏幕显示,to_ide=True支持IDE调试
VIRT模式:虚拟显示,1920×1080分辨率,适合开发调试

2. 矩形检测核心算法
python
  1. for r in img.find_rects(threshold=8000):
复制代码


算法深度解析:
find_rects():基于轮廓检测的矩形查找算法
threshold=8000:轮廓质量阈值
高阈值:只检测轮廓清晰、完整的矩形
低阈值:检测更多可能矩形,但包含噪声

检测原理:
边缘检测提取轮廓
多边形近似找到四边形
几何约束验证矩形特性
阈值过滤确保轮廓质量

3. 矩形对象结构
python
  1. r.rect()      # 返回矩形边界框: (x, y, width, height)
  2. r.corners()   # 返回四个角点坐标: [(x1,y1), (x2,y2), (x3,y3), (x4,y4)]
复制代码


4. 可视化渲染系统
python
  1. # 绘制矩形边框 - 天蓝色,2像素线宽
  2. img.draw_rectangle(r.rect(), color=(40, 167, 225), thickness=2)
  3. # 绘制角点标记 - 深绿色,8像素半径圆点
  4. for p in r.corners():
  5.     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
  1. x = (DISPLAY_WIDTH - PICTURE_WIDTH) / 2  # (640-400)/2 = 120
  2. y = (DISPLAY_HEIGHT - PICTURE_HEIGHT) / 2 # (480-240)/2 = 120
复制代码


自动计算居中位置
保持图像在显示中心
适应不同分辨率组合

3. 性能监控
python
  1. clock = time.clock()
  2. clock.tick()    # 开始计时
  3. clock.fps()     # 计算帧率
复制代码


实时监控处理性能
为算法调优提供数据支持
算法工作流程
主循环执行序列
图像捕获:从摄像头获取400×240分辨率帧
矩形检测:运行find_rects算法查找所有矩形
可视化绘制:为每个检测到的矩形绘制边框和角点
信息输出:打印矩形详细信息到控制台
居中显示:将处理后的图像居中显示在屏幕上
性能统计:计算并显示当前FPS

矩形检测详细流程
text
原始图像 → 边缘检测 → 轮廓提取 → 多边形近似 →
四边形过滤 → 矩形验证 → 阈值筛选 → 结果输出
异常处理与资源管理
三级保护机制
python
  1. try:
  2.     # 主程序逻辑
  3. except KeyboardInterrupt:    # 用户主动中断
  4. except BaseException:        # 其他所有异常
  5. 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
  1. # 高噪声环境 - 提高阈值
  2. threshold = 10000
  3. # 需要高灵敏度 - 降低阈值  
  4. threshold = 5000
复制代码


分辨率调整
python
  1. # 更高精度检测
  2. PICTURE_WIDTH = 640
  3. PICTURE_HEIGHT = 480
  4. # 更高处理速度
  5. PICTURE_WIDTH = 320
  6. PICTURE_HEIGHT = 240
复制代码


总结
这个矩形检测系统体现了嵌入式计算机视觉的工程最佳实践:
性能与质量的平衡:通过分辨率策略优化处理效率
完整的视觉反馈:边框+角点的双重标记提供丰富信息
稳健的系统架构:异常处理和资源管理确保长期稳定运行
实用的检测算法:基于轮廓的矩形检测满足实际应用需求
灵活的可配置性:支持多种显示模式和参数调整

代码结构清晰,功能完整,既是可立即使用的矩形检测工具,也是学习嵌入式视觉开发的优秀教学范例。
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测

实验串口返回情况

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图1

实验场景图  

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图2

【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测图3

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail