驴友花雕 发表于 2025-11-6 19:16:19

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



什么是 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 倍。



驴友花雕 发表于 2025-11-6 19:27:26

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

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

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

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



3、实操示例(OpenCV 轮廓拟合实现)
适合快速落地,无需复杂预处理,适配多数简单场景:
python
import cv2

import numpy as np



# 读取图像(可替换为K230摄像头采集帧)

img = cv2.imread("document.jpg")

img_copy = img.copy()

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)



# 图像预处理:降噪+边缘检测

blur = cv2.GaussianBlur(gray, (5, 5), 0)

canny = cv2.Canny(blur, 50, 150)



# 查找轮廓(只保留外部轮廓)

contours, _ = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)



# 筛选矩形轮廓

for cnt in contours:

    # 多边形逼近(epsilon控制逼近精度,越小越接近原轮廓)

    epsilon = 0.02 * cv2.arcLength(cnt, True)

    approx = cv2.approxPolyDP(cnt, epsilon, True)

   

    # 筛选条件:边数为4 + 轮廓面积足够大(过滤噪声)

    if len(approx) == 4 and cv2.contourArea(approx) > 1000:

      # 验证邻边垂直(计算向量夹角,接近90°)

      x1, y1 = approx

      x2, y2 = approx

      x3, y3 = approx

      vec1 = (x2-x1, y2-y1)

      vec2 = (x3-x2, y3-y2)

      dot = abs(vec1*vec2 + vec1*vec2)# 点积,垂直时为0

      if dot < 100:# 允许微小偏差

            # 绘制矩形(绿色边框,厚度2)

            cv2.drawContours(img_copy, , -1, (0, 255, 0), 2)

            # 标注矩形顶点坐标

            for (x, y) in approx[:, 0]:

                cv2.circle(img_copy, (x, y), 5, (255, 0, 0), -1)



# 显示结果

cv2.imshow("Rectangle Detection", img_copy)

cv2.waitKey(0)

cv2.destroyAllWindows()







驴友花雕 发表于 2025-11-6 19:55:36

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

【花雕动手做】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, p, 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, p, 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

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

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

驴友花雕 发表于 2025-11-6 19:59:53

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

实验串口返回情况



实验场景图





页: [1]
查看完整版本: 【花雕动手做】CanMV K230 AI 视觉识别模块之矩形检测