星瞳实验室APP,快速收到回复
  • 我们只解决官方正版的OpenMV的问题(STM32),其他的分支有很多兼容问题,我们无法解决。
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 怎么更好的识别橙色球?



    • 当识别橙色球的时候,总是和红色球分不清,请问怎么解决?

      import sensor, image, time
      import json
      from pyb import UART
      from pyb import LED#定义led灯
      red_led   = LED(1)
      green_led = LED(2)
      blue_led  = LED(3)
      #颜色的阈值需要根据现场的环境不同而做出更改(thresholds = (minL, maxL, minA, maxA, minB, maxB))
      thresholds = [(31, 53, 31, 127, 22, 126),      #赤
                    (30, 55, 3, 46, 28, 58),        #橙
                    (55, 87, -13, 35, 14, 32),      #黄
                    (13, 28, -128, -7, -128, 12),     #绿
                    (51, 95, -58, -3, -56, -13),     #蓝
                    ]
                                        #(RGB颜色值代码)
      color_thresholds=[(255,0,0),      #赤
                        (255,215,0),    #橙
                        (255,255,0),    #黄
                        (0,255,0),      #绿
                        (0,0,255),      #蓝
                        ]
      sensor.reset()                     #初始化感光元件
      sensor.set_pixformat(sensor.RGB565)#设置图像为彩色
      sensor.set_framesize(sensor.QQVGA)  #设置图像格式为QVGA:320X240 或者:QQVGA:160X120
      sensor.skip_frames(time = 2000)    #让新设置生效
      sensor.set_auto_gain(False)        #必须关闭颜色跟踪
      sensor.set_auto_whitebal(False)    #必须关闭颜色跟踪
      #关闭白平衡,白平衡默认是开启的,在颜色识别中,需要关闭白平衡
      clock = time.clock()
      uart = UART(3, 115200)#开启串口3,把球体得坐标发送出去,使用特定的波特率初始化
      uart.init(115200, bits=8, parity=None, stop=1)#串口初始化
      clock = time.clock() # Tracks FPS.
      new_roi=(0,0,160,120)
      '''
        扩宽roi
      '''
      def expand_roi(roi):                          #找到特征区域颜色
                                                    # set for QQVGA 160*120或者使用 QVGA:320*240
          extra = 5
          win_size = (160, 120)
          (x, y, width, height) = roi
          new_roi = [x-extra, y-extra, width+2*extra, height+2*extra]
      
          if new_roi[0] < 0:
              new_roi[0] = 0
          if new_roi[1] < 0:
              new_roi[1] = 0
          if new_roi[2] > win_size[0]:
              new_roi[2] = win_size[0]
          if new_roi[3] > win_size[1]:
              new_roi[3] = win_size[1]
          return tuple(new_roi)
      
      
      def Uart_str(blobs,j):                         #串口发送字符压缩函数
          if blobs.x() < 10:
              str1="00%d"%blobs.x()
          elif blobs.x()<100:
              str1="0%d"%blobs.x()
          else:
              str1="%d"%blobs.x()
          if blobs.y()<10:
              str2="00%d"%blobs.y()
          elif blobs.y()<100:
              str2="0%d"%blobs.y()
          else:
              str2="%d"%blobs.y()
          str3="S"+"X"+str1+"Y"+str2+"%d"%j+"s"
          return str3
      i=0                                            #定义变量i,即为颜色代表0-赤    10-粉
      while(True):
          clock.tick()                               # Track elapsed milliseconds between snapshots().
          img = sensor.snapshot().lens_corr(1.8)    #读取图片
          if i >= 5:                               #10种颜色
              i = 0                                  #大于10 归0
          blobs = img.find_blobs([thresholds[i]],area_threshold=20,pixels_threshold=50,x_stride=2,y_stride=2)
          #找到对应颜色区域,area_threshold表示面积最小值,可通过面积过滤一些微小的颜色点
          #print(blobs)
          i=i+1
          red_led.on()                               #正常工作状态红灯亮起
          if blobs:
              red_led.off()
              green_led.off()
              blue_led.on()
              for blob in blobs:
                  is_circle = False
                  max_circle = None
                  max_radius = -1
      
                  new_roi = expand_roi(blob.rect())#限定识别区域
      
                  for c in img.find_circles(threshold =50, x_margin = 2, y_margin = 2, r_margin = 2,r_min = 1, r_max =10,  roi=new_roi):
                  #找圆函数threshold = 3500比较合适。如果视野中检测到的圆过多,请增大阈值;
                  #相反,如果视野中检测到的圆过少,请减少阈值。
                      is_circle = True
                      if c.r() > max_radius:
                          max_radius = c.r()
                          max_circle = c
                  if is_circle:
                      img.draw_cross(max_circle.x(), max_circle.y(),color = color_thresholds[i-1])            #画十字
                      img.draw_circle(max_circle.x(), max_circle.y(), max_circle.r() + 1, color = color_thresholds[i-1])#画圆
                      output_str=Uart_str(max_circle,i-1)
                      print(output_str)
                      uart.write(output_str)
                      red_led.off()
                      green_led.on()
                      blue_led.off()
          #print(clock.fps())
      
      


    • 把两个球都放在画面中,使用阈值助手调试。

      https://book.openmv.cc/image/blob.html#颜色阈值选择工具