导航

    • 登录
    • 搜索
    • 版块
    • 产品
    • 教程
    • 论坛
    • 淘宝
    1. 主页
    2. matv
    3. 楼层
    M
    • 举报资料
    • 资料
    • 关注
    • 粉丝
    • 屏蔽
    • 帖子
    • 楼层
    • 最佳
    • 群组

    matv 发布的帖子

    • 为什么会显示'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毫秒
      
      
      ```![1_1754546351063_IMG_8717.HEIC](正在上传 98%) ![0_1754546351063_IMG_8718.JPG](正在上传 98%)
      发布在 OpenMV Cam
      M
      matv