为什么会显示'image' object has no attribute to 'to_hsv'
-
# 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毫秒 ``` 
-
这是因为image模块里面没有to_hsv这个函数:https://docs.singtown.com/micropython/zh/latest/openmvcam/library/omv.image.html