k230 Pyhton三角形识别

本文介绍了一个基于K230 CanMV开发板的多颜色三角形识别程序,能够检测红、绿、蓝三种颜色的三角形。程序使用摄像头获取实时图像,通过LAB颜色阈值过滤识别特定颜色的色块,并判断是否为三角形(通过检测4个角点)。识别到的三角形会标注外接矩形、轮廓线、中心十字和颜色文字。程序支持LCD/HDMI/VIRT三种显示模式,具有完善的资源释放机制。该方案适用于K230 CanMV v1.2.2版本,可作为计算机视觉应用的开发参考。

cpp 复制代码
# 立创·庐山派-K230-CanMV开发板 多颜色三角形识别(红/绿/蓝)
# 适配K230 CanMV v1.2.2
import time, os, sys
from media.sensor import *
from media.display import *
from media.media import *

sensor_id = 2
sensor = None
# 显示模式:LCD(开发板屏幕)/HDMI/VIRT(虚拟屏)
DISPLAY_MODE = "LCD"

# 显示分辨率配置
if DISPLAY_MODE == "VIRT":
    DISPLAY_WIDTH = ALIGN_UP(1920, 16)
    DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
    DISPLAY_WIDTH = 800
    DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
    DISPLAY_WIDTH = 1920
    DISPLAY_HEIGHT = 1080
else:
    raise ValueError("DISPLAY_MODE仅支持 'VIRT', 'LCD', 'HDMI'")

# 红/绿/蓝 三色LAB阈值(全部启用,适配K230摄像头)
# 格式:(L Min, L Max, A Min, A Max, B Min, B Max)
color_thresholds = [
    (46, 66, 14, 92, -29, 106),    # 红色阈值(启用)
    (52, 88, -85, -6, -11, 91),  # 绿色阈值
    (47, 76, -35, 51, -83, -32)  # 蓝色阈值
]

try:
    # 初始化摄像头(沿用稳定的初始化逻辑)
    sensor = Sensor(id=sensor_id)
    sensor.reset()
    sensor.set_framesize(width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, chn=CAM_CHN_ID_0)
    sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)

    # 初始化显示器
    if DISPLAY_MODE == "VIRT":
        Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)
    elif DISPLAY_MODE == "LCD":
        Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
    elif DISPLAY_MODE == "HDMI":
        Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)

    MediaManager.init()
    sensor.run()
    print("K230多颜色三角形识别程序启动(红/绿/蓝),按Ctrl+C退出")

    while True:
        os.exitpoint()
        # 获取摄像头实时帧
        img = sensor.snapshot(chn=CAM_CHN_ID_0)

        # 查找色块(过滤小噪声,面积>2000像素)
        blobs = img.find_blobs(color_thresholds, area_threshold=2000)

        if blobs:
            for blob in blobs:
                # 获取色块角点,判断是否为三角形(角点数量=3)
                corners = blob.corners()
                if len(corners) == 4:
                    # 根据颜色索引确定识别到的颜色
                    color_flag = blob[8]
                    if color_flag & 0x01:
                        color_name = "red"
                        draw_color = (255, 0, 0)  # 红色RGB
                    elif color_flag & 0x02:
                        color_name = "green"
                        draw_color = (0, 255, 0)  # 绿色RGB
                    elif color_flag & 0x04:
                        color_name = "blue"
                        draw_color = (0, 0, 255)  # 蓝色RGB
                    else:
                        color_name = "unknown"
                        draw_color = (128, 128, 128)  # 灰色

                    # 1. 绘制三角形外接矩形(白色框)
                    img.draw_rectangle(blob[0:4], color=(255, 255, 255), thickness=3)
                    # 2. 绘制三角形轮廓(对应颜色线条,循环3次)
                    for i in range(3):
                        x1, y1 = corners[i]
                        x2, y2 = corners[(i + 1) % 3]
                        img.draw_line(x1, y1, x2, y2, color=draw_color, thickness=3)
                    # 3. 绘制中心十字(黄色)
                    img.draw_cross(blob[5], blob[6], color=(255, 255, 0), size=10)
                    # 4. 标注三角形+颜色文字
                    img.draw_string(blob[0], blob[1]-20, f"Triangle: {color_name}",
                                   color=draw_color, scale=2, mono_space=False)
                    # 5. 串口打印识别结果
                    print(f"识别到【{color_name}】三角形 - 中心坐标:X={blob[5]}, Y={blob[6]}")

        # 显示处理后的图像到屏幕
        Display.show_image(img)

except KeyboardInterrupt:
    print("\n用户手动终止程序")
except BaseException as e:
    print(f"程序异常:{str(e)}")
finally:
    # 释放硬件资源
    if sensor:
        sensor.stop()
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    MediaManager.deinit()
    print("程序退出,资源已释放")
相关推荐
Sinclair4 小时前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
Rockbean1 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
蝎子莱莱爱打怪1 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
茶杯梦轩1 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
海天鹰2 天前
【免费】PHP主机=域名+解析+主机
服务器
DianSan_ERP2 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅2 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒2 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
芝士雪豹只抽瑞克五2 天前
Nginx 高性能Web服务器笔记
服务器·nginx
失重外太空啦2 天前
Tomcat
java·服务器·tomcat