• 免费好用的星瞳AI云服务上线!简单标注,云端训练,支持OpenMV H7和OpenMV H7 Plus。可以替代edge impulse。 https://forum.singtown.com/topic/9519
  • 我们只解决官方正版的OpenMV的问题(STM32),其他的分支有很多兼容问题,我们无法解决。
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 前九个兴趣区找点都能找到,最后一个兴趣区找不同的一种颜色的时候,无法识别,后面程序也不再运行



    • import sensor, image, time,pyb
      from pyb import UART
      
      
      uart = UART(3,115200)                                          # 打开串口3
      uart.init(115200, bits=8, parity=None, stop=1)
      
      
      led = pyb.LED(3)                                               # 打开LED指示灯
      led.on()
      
      
      xgain=50
      ygain=42
      bigBlob = None
      Pcircle= None                # 背景色块,元组【X,Y,W,H】
      Pcircle00= None
      Pcircle11= None              # 1号rio区域目标点,元组【中心X,中心Y,半径】
      Pcircle22= None              # 2号rio区域目标点,元组【中心X,中心Y,半径】
      Pcircle33= None              # 3号rio区域目标点,元组【中心X,中心Y,半径】
      Pcircle44= None              # 4号rio区域目标点,元组【中心X,中心Y,半径】
      Pcircle55= None              # 5号rio区域目标点,元组【中心X,中心Y,半径】
      Pcircle66= None              # 6号rio区域目标点,元组【中心X,中心Y,半径】
      Pcircle77= None              # 7号rio区域目标点,元组【中心X,中心Y,半径】
      Pcircle88= None              # 8号rio区域目标点,元组【中心X,中心Y,半径】
      Pcircle99= None              # 9号rio区域目标点,元组【中心X,中心Y,半径】
      
      W_data=[[0,0,0],             # 创建列表,用于串口发送数据,9维列表【检测FLAG,中心X,中心Y】
              [0,0,0],
              [0,0,0],
              [0,0,0],
              [0,0,0],
              [0,0,0],
              [0,0,0],
              [0,0,0],
              [0,0,0],
              [0,0,0],]
      
      
      
      thresholds = [(36, 0, -14, 6, -72, 15)]#黑色
      thresholds1 = [(95, 46, -128, 27, -127, 6)]#白色
      thresholds2 = [(95, 46, -34, 20, 26, 127)]#黄色
      
      
      sensor.reset()                                                 # Initialize the camera sensor.
      sensor.set_pixformat(sensor.RGB565)                            # use RGB565.
      sensor.set_framesize(sensor.HQVGA)                              #240x160 HQVGA
      sensor.skip_frames(time=1000)                                  # Let new settings take affect.
      sensor.set_auto_gain(False,6)                                  #设置亮度增益must be turned off for color tracking
      sensor.set_auto_whitebal(False,(-5.119987, -6.02073, -3.059389))#设置设置红色,绿色和蓝色通道的固定增益分贝。关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡。
      clock = time.clock()                                           # Tracks FPS.
      
      
      
      
      # 比较两个色块大小的函数
      # 这里我们选择了pixels作为指标比对二者的代码
      # 你也可以换用其它指标 例如 blob.area()
      def compareBlob(blob1, blob2):
          tmp = blob1.pixels() - blob2.pixels()
          if tmp == 0:
              return 0;
          elif tmp > 0:
              return 1;
          else:
              return -1;
      
      
      
      
      
      while(True):
          clock.tick()
          img = sensor.snapshot()
      
      
      #########################找黑色球板####################################
          blobs = img.find_blobs(thresholds)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
              #Pcircle= bigBlob.rect()
              Pcircle=[bigBlob.x()+12,bigBlob.y()+15,bigBlob.w()-15,bigBlob.h()-15]
              #####################画图辅助判断可注释##############################
              img.draw_rectangle(Pcircle,color=127)
              #####################画图辅助判断可注释##############################
      
      
      
      
      ###########################预估九个色块所在roi区域####################################
              Pcircle1=[Pcircle[0],           Pcircle[1],             xgain,ygain]
              Pcircle2=[Pcircle[0]+xgain,     Pcircle[1],             xgain,ygain]
              Pcircle3=[Pcircle[0]+xgain*2,   Pcircle[1],             xgain,ygain]
              Pcircle4=[Pcircle[0],           Pcircle[1]+ygain,       xgain,ygain]
              Pcircle5=[Pcircle[0]+xgain,     Pcircle[1]+ygain,       xgain,ygain]
              Pcircle6=[Pcircle[0]+xgain*2,   Pcircle[1]+ygain,       xgain,ygain]
              Pcircle4=[Pcircle[0],           Pcircle[1]+ygain,       xgain,ygain]
              Pcircle5=[Pcircle[0]+xgain,     Pcircle[1]+ygain,       xgain,ygain]
              Pcircle6=[Pcircle[0]+xgain*2,   Pcircle[1]+ygain,       xgain,ygain]
              Pcircle7=[Pcircle[0],           Pcircle[1]+ygain*2,     xgain,ygain]
              Pcircle8=[Pcircle[0]+xgain,     Pcircle[1]+ygain*2,     xgain,ygain]
              Pcircle9=[Pcircle[0]+xgain*2,   Pcircle[1]+ygain*2,     xgain,ygain]
              #####################画图辅助判断可注释##############################
              img.draw_rectangle(Pcircle1)
              img.draw_rectangle(Pcircle2)
              img.draw_rectangle(Pcircle3)
              img.draw_rectangle(Pcircle4)
              img.draw_rectangle(Pcircle5)
              img.draw_rectangle(Pcircle6)
              img.draw_rectangle(Pcircle7)
              img.draw_rectangle(Pcircle8)
              img.draw_rectangle(Pcircle9)
              #####################画图辅助判断可注释##############################
      
      
      
      
      
      ###########################检测各roi区域色块####################################
      
          ################roi1区域###########################
          blobs = img.find_blobs(thresholds1,roi=Pcircle1)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
                  Pcircle11= bigBlob.enclosing_circle()
                  #####################画图辅助判断可注释##############################
                  img.draw_circle(Pcircle11)
                  img.draw_cross(Pcircle11[0], Pcircle11[1])
                  #####################画图辅助判断可注释##############################
              W_data[0][0]=1;
              W_data[0][1]=Pcircle11[0];
              W_data[0][2]=Pcircle11[1];
          else:
              W_data[0][0]=0;
      
          ################roi2区域###########################
          blobs = img.find_blobs(thresholds1,roi=Pcircle2)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
                  Pcircle22= bigBlob.enclosing_circle()
                  #####################画图辅助判断可注释##############################
                  img.draw_circle(Pcircle22)
                  img.draw_cross(Pcircle22[0], Pcircle22[1])
                  #####################画图辅助判断可注释##############################
              W_data[1][0]=1;
              W_data[1][1]=Pcircle22[0];
              W_data[1][2]=Pcircle22[1];
          else:
              W_data[1][0]=0;
      
          ################roi3区域###########################
          blobs = img.find_blobs(thresholds1,roi=Pcircle3)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
                  Pcircle33= bigBlob.enclosing_circle()
                  #####################画图辅助判断可注释##############################
                  img.draw_circle(Pcircle33)
                  img.draw_cross(Pcircle33[0], Pcircle33[1])
                  #####################画图辅助判断可注释##############################
                  W_data[2][0]=1;
                  W_data[2][1]=Pcircle33[0];
                  W_data[2][2]=Pcircle33[1];
          else:
              W_data[2][0]=0;
      
          ################roi4区域###########################
          blobs = img.find_blobs(thresholds1,roi=Pcircle4)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
                  Pcircle44= bigBlob.enclosing_circle()
                  #####################画图辅助判断可注释##############################
                  img.draw_circle(Pcircle44)
                  img.draw_cross(Pcircle44[0], Pcircle44[1])
                  #####################画图辅助判断可注释##############################
                  W_data[3][0]=1;
                  W_data[3][1]=Pcircle44[0];
                  W_data[3][2]=Pcircle44[1];
          else:
              W_data[3][0]=0;
      
          ################roi5区域###########################
          blobs = img.find_blobs(thresholds1,roi=Pcircle5)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
                  Pcircle55= bigBlob.enclosing_circle()
                  #####################画图辅助判断可注释##############################
                  img.draw_circle(Pcircle55)
                  img.draw_cross(Pcircle55[0], Pcircle55[1])
                  #####################画图辅助判断可注释##############################
                  W_data[4][0]=1;
                  W_data[4][1]=Pcircle55[0];
                  W_data[4][2]=Pcircle55[1];
          else:
              W_data[4][0]=0;
      
          ################roi6区域###########################
          blobs = img.find_blobs(thresholds1,roi=Pcircle6)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
                  Pcircle66= bigBlob.enclosing_circle()
                  #####################画图辅助判断可注释##############################
                  img.draw_circle(Pcircle66)
                  img.draw_cross(Pcircle66[0], Pcircle66[1])
                  #####################画图辅助判断可注释##############################
                  W_data[5][0]=1;
                  W_data[5][1]=Pcircle66[0];
                  W_data[5][2]=Pcircle66[1];
          else:
              W_data[5][0]=0;
      
          ################roi7区域###########################
          blobs = img.find_blobs(thresholds1,roi=Pcircle7)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
                  Pcircle77= bigBlob.enclosing_circle()
                  #####################画图辅助判断可注释##############################
                  img.draw_circle(Pcircle77)
                  img.draw_cross(Pcircle77[0], Pcircle77[1])
                  #####################画图辅助判断可注释##############################
                  W_data[6][0]=1;
                  W_data[6][1]=Pcircle77[0];
                  W_data[6][2]=Pcircle77[1];
          else:
              W_data[6][0]=0;
      
          ################roi8区域###########################
          blobs = img.find_blobs(thresholds1,roi=Pcircle8)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
                  Pcircle88= bigBlob.enclosing_circle()
                  #####################画图辅助判断可注释##############################
                  img.draw_circle(Pcircle88)
                  img.draw_cross(Pcircle88[0], Pcircle88[1])
                  #####################画图辅助判断可注释##############################
                  W_data[7][0]=1;
                  W_data[7][1]=Pcircle88[0];
                  W_data[7][2]=Pcircle88[1];
          else:
              W_data[7][0]=0;
      
          ################roi9区域###########################
          blobs = img.find_blobs(thresholds1,roi=Pcircle9)
          if blobs:
              bigBlob = blobs[0]
              for blob in blobs:
                  if compareBlob(bigBlob, blob) == -1:
                      bigBlob = blob
                  Pcircle99= bigBlob.enclosing_circle()
                  #####################画图辅助判断可注释##############################
                  img.draw_circle(Pcircle99)
                  img.draw_cross(Pcircle99[0], Pcircle99[1])
                  #####################画图辅助判断可注释##############################
              W_data[8][0]=1;
              W_data[8][1]=Pcircle99[0];
              W_data[8][2]=Pcircle99[1];
          else:
              W_data[8][0]=0;
      
      ################小球区域###########################
      
      
      
      blobs = img.find_blobs(thresholds2,roi=Pcircle)
      if blobs:
          bigBlob = blobs[0]
          for blob in blobs:
              if compareBlob(bigBlob, blob) == -1:
                  bigBlob = blob
              Pcircle00= bigBlob.enclosing_circle()
              #####################画图辅助判断可注释##############################
              img.draw_circle(Pcircle00)
              img.draw_cross(Pcircle00[0], Pcircle000[1])
              #####################画图辅助判断可注释##############################
          W_data[9][0]=1;
          W_data[9][1]=Pcircle00[0];
          W_data[9][2]=Pcircle00[1];
      else:
          W_data[9][0]=0;
          
      
      
      
      
          img_data = bytearray(   [0x5a,
                                  W_data[0][0], W_data[0][1], W_data[0][2],
                                  W_data[1][0], W_data[1][1], W_data[1][2],
                                  W_data[2][0], W_data[2][1], W_data[2][2],
                                  W_data[3][0], W_data[3][1], W_data[3][2],
                                  W_data[4][0], W_data[4][1], W_data[4][2],
                                  W_data[5][0], W_data[5][1], W_data[5][2],
                                  W_data[6][0], W_data[6][1], W_data[6][2],
                                  W_data[7][0], W_data[7][1], W_data[7][2],
                                  W_data[8][0], W_data[8][1], W_data[8][2],
                                 # W_data[9][0], W_data[9][1], W_data[9][2],
                                  0x5b])
          uart.write(img_data)
      
          #####################打印辅助判断可注释##############################
          print(  [W_data[0][0], W_data[0][1], W_data[0][2]],
                  [W_data[1][0], W_data[1][1], W_data[1][2]],
                  [W_data[2][0], W_data[2][1], W_data[2][2]],
                  [W_data[3][0], W_data[3][1], W_data[3][2]],
                  [W_data[4][0], W_data[4][1], W_data[4][2]],
                  [W_data[5][0], W_data[5][1], W_data[5][2]],
                  [W_data[6][0], W_data[6][1], W_data[6][2]],
                  [W_data[7][0], W_data[7][1], W_data[7][2]],
                  [W_data[8][0], W_data[8][1], W_data[8][2]],
                 # [W_data[8][0], W_data[8][1], W_data[8][2]]
                  )
          #####################打印辅助判断可注释##############################
      
          led.toggle()#LED闪烁
      


    • 291行到最后,缩进不对,在while死循环外面。