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



    • 我先通过颜色阈值 二值化图像,然后去用find_circles想去识别圆形,然后再得到圆形数量。因为find_circles函数不太准确,数值出现波动,所以我想用 找到数量最多的那个值,作为圆形的数量。但为啥每次while它都会把数据清空啊 ?是因为我这个是局部变量?感觉是python 没学好。求教。

      import sensor, image, time
      red_threshold   = ((0, 33, 12, 72, -89, 73))
      ensor.reset() # 初始化摄像头
      sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
      sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 速度快一些
      sensor.skip_frames(time = 2000) # 跳过2000s,使新设置生效,并自动调节白平衡
      sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的,在颜色识别中,一定要关闭白平衡。
      sensor.set_auto_whitebal(False)
      #关闭白平衡。白平衡是默认开启的,在颜色识别中,一定要关闭白平衡。
      sensor.set_gainceiling(8)
      clock = time.clock() # 追踪帧率
      
      def find_max(cs):
          max_num= 0
          num_y = 0
          for c in cs:
              num_y += 1
              if num_y > max_num:
                  max_num = num_y
          return max_num
      
      while(True):
          clock.tick() # Track elapsed milliseconds between snapshots().
          img = sensor.snapshot().lens_corr(1.8) # 从感光芯片获得一张图像
          img.histeq(adaptive=True, clip_limit=3)
          img.median(1, percentile=0.5)   
          # 图像锐化
          img.laplacian(1, sharpen=True)
          #图像二值化
          img.binary([red_threshold])
          cs = img.find_circles(x_stride=2, y_stride=2,threshold = 4600, x_margin = 10, y_margin = 10, r_margin = 10,r_min = 5, r_max = 50, r_step = 2)
          if cs:
              max_cs = find_max(cs)
              print(max_cs)


    • len(cs)就是圆的数量。find_max应该是找最大的圆,但是你的这个find_max我看不懂。



    • 你应该定义一个全局变量。

      max_cs = 0
      
      while True:
          img = sensor.snapshot()
          cs = img.find_circles()
          if len(cs)>max_cs :
              max_cs = cs
          print(max_cs)
      


    • @kidswong999 我是因为在while(True)循环里,图像一直在刷新,导致find_circles()出来的圆的个数 一直在波动,然后我要给出一个稳定不变的圆的个数,通过find_max函数找到识别圆个数的最多的那一次为圆的个数。



    • @zik3 所以要用我上面的代码。不要用find_max函数,