# main_rgb_to_hsv.py - 备用OpenMV颜色识别程序
# 适用于OpenMV H7 Plus,当sensor.HSV565不可用时使用
# 该版本使用RGB565格式捕获图像,并在Python中手动进行RGB到HSV的转换。
import sensor, image, time, pyb
from pyb import UART
from pyb import LED
# 初始化LED,用于调试或指示
red_led = LED(1) # 红色LED
green_led = LED(2) # 绿色LED
blue_led = LED(3) # 蓝色LED
# 禁用所有LED,确保初始状态为关闭
red_led.off()
green_led.off()
blue_led.off()
# 摄像头初始化设置
sensor.reset() # 重置并初始化摄像头传感器
sensor.set_pixformat(sensor.RGB565) # **关键修改:设置像素格式为RGB565**
# 因为HSV565可能不可用,我们先捕获RGB图像。
sensor.set_framesize(sensor.QVGA) # 设置图像分辨率为QVGA (320x240)。
sensor.skip_frames(time = 2000) # 跳过2000毫秒(2秒)的帧,让摄像头有时间自动调整。
sensor.set_auto_gain(False) # 关闭自动增益。
sensor.set_auto_whitebal(False) # 关闭自动白平衡。
# 初始化UART通信
uart = UART(3, 9600) # 初始化UART3,波特率为9600。
# 请根据实际连接的STM32F103的UART端口进行调整。
# 定义颜色阈值 (H Min, H Max, S Min, S Max, V Min, V Max) for HSV
# 这些是HSV颜色空间的阈值,需要根据实际环境和目标颜色进行精确校准。
# 建议使用OpenMV IDE的“工具 -> 阈值编辑器”来获取最准确的阈值。
# 格式为 [H_min, H_max, S_min, S_max, V_min, V_max]
# H (Hue): 色调 (0-179)
# S (Saturation): 饱和度 (0-255)
# V (Value): 亮度 (0-255)
color_thresholds_hsv = [
(0, 179, 0, 255, 0, 50), # 黑色阈值:亮度V值较低,H和S范围较广
(40, 80, 40, 255, 40, 255), # 绿色阈值:H值在绿色范围,S和V值较高
(90, 130, 40, 255, 40, 255) # 蓝色阈值:H值在蓝色范围,S和V值较高
]
# 定义ROI (Region of Interest) - 感兴趣区域
roi = (130, 0, 100, 100) # 示例ROI,请根据实际应用场景调整。
# 初始化时钟,用于计算帧率或延时
clock = time.clock()
# 主循环
while(True):
clock.tick() # 更新时钟,用于计算帧率
img = sensor.snapshot() # 从摄像头获取一张RGB图像快照
# **关键修改:将RGB图像转换为HSV图像**
# OpenMV的image模块提供了to_hsv()方法,可以直接将RGB图像转换为HSV图像。
# 这是一个高效的内置函数,比手动逐像素转换快得多。
hsv_img = img.to_hsv() # 将当前RGB图像转换为HSV图像
# 遍历每种颜色阈值进行色块查找
# 注意:find_blobs现在是在hsv_img上操作,并使用hsv阈值
for i, thresholds in enumerate(color_thresholds_hsv):
# find_blobs函数用于在HSV图像中查找符合指定HSV颜色阈值的色块
blobs = hsv_img.find_blobs([thresholds], pixels_threshold=200, area_threshold=200, merge=True, roi=roi)
# 遍历当前颜色找到的所有色块
for blob in blobs:
# 检查色块的像素数量是否足够大
if blob.pixels() > 200:
# 在OpenMV IDE的图像窗口中绘制色块的矩形框和中心点
# 注意:绘制是在原始的RGB图像(img)上进行的,因为帧缓冲区显示的是RGB图像
img.draw_rectangle(blob.rect()) # 绘制色块的最小外接矩形
img.draw_cross(blob.cx(), blob.cy()) # 绘制色块的中心点
# 根据识别到的颜色,点亮对应的LED
if i == 0: # 黑色
red_led.on()
green_led.off()
blue_led.off()
elif i == 1: # 绿色
red_led.off()
green_led.on()
blue_led.off()
elif i == 2: # 蓝色
red_led.off()
green_led.off()
blue_led.on()
# 通过UART发送识别到的颜色索引
uart.write("{}".format(str(i))) # 通过UART发送数据
print("识别到颜色: {}".format(i)) # 在OpenMV IDE的串口终端打印识别到的颜色
# 如果没有识别到任何颜色,关闭所有LED
# 注意:这里也需要在hsv_img上进行查找判断
if not any(hsv_img.find_blobs([t], pixels_threshold=200, area_threshold=200, merge=True, roi=roi) for t in color_thresholds_hsv):
red_led.off()
green_led.off()
blue_led.off()
# 打印帧率,用于性能评估
# print(clock.fps()) # 打印当前帧率,可以取消注释查看
# 短暂延时
time.sleep_ms(50) # 延时50毫秒
``` 
M
matv
@matv
0
声望
1
楼层
14
资料浏览
0
粉丝
0
关注
matv 发布的帖子
-
为什么会显示'image' object has no attribute to 'to_hsv'