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



    • 我想通过颜色先分割,然后再通过形状识别去判断圆形个数。它为啥数字会不停跳变啊。然后我就想while循环只在形状识别处循环,而不是整个获取图片,处理图片循环。也就是对同一张图片不停识别,为啥就没有结果?

      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([green_threshold])
      img.to_grayscale(copy=False, rgb_channel=-1)
      
      img.morph(kernel_size, kernel)
      img.dilate(1,threshold = 4)
      img.erode(1, threshold = 1)
        
      
      #圆形识别
      while(True):
          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:
          num_y = 0
          for c in cs:
              img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))
              num_y += 1
              #num_stry = '%d' %num_y
              #uart.write('num_y =' +num_stry+'\r\n')
          print(num_y)
          time.sleep_ms(100)
      
      
      


    • 你的代码不能运行,请上传完整的代码。



    • import sensor, image, time
      from pyb import UART
      # 色块监测
      # 颜色追踪一定要控制环境的光,保持光线是稳定的。
      green_threshold   = ((41, 0, -75, -18, -8, 52))
      #设置绿色的阈值,括号里面的数值分别是L A B 的最大值和最小值(minL, maxL, minA,
      # maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需
      #设置(min, max)两个数字即可。
      
      #设置核函数滤波,核内每个数值值域为[-128,127],核需为列表或元组
      kernel_size = 1 # kernel width = (size*2)+1, kernel height = (size*2)+1
      kernel = [-1, -1, -1,\
                -1, +8, -1,\
                -1, -1, -1]
      # 这个一个高通滤波器。见这里有更多的kernel
      
      sensor.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() # 追踪帧率
      
      # 在OV7725 sensor上, 边缘检测可以通过设置sharpness/edge寄存器来增强。
      # 注意:这将在以后作为一个函数实现
      if (sensor.get_id() == sensor.OV7725):
          sensor.__write_reg(0xAC, 0xDF)
          sensor.__write_reg(0x8F, 0xFF)
      
      uart = UART(3, 19200) #实例化 波特率19200的串口3
      
      
      clock.tick() # Track elapsed milliseconds between snapshots().
      img = sensor.snapshot().lens_corr(1.8) # 从感光芯片获得一张图像
      
          # clip_limit <0为您提供正常的自适应直方图均衡,这可能会导致大量的对比噪音...
      
             # clip_limit=1 什么都不做。为获得最佳效果,请略高于1,如下所示。
             # 越高,越接近标准自适应直方图均衡,并产生巨大的对比度波动。
      img.histeq(adaptive=True, clip_limit=3)
      
      # 中值滤波
      # Size是内核的大小。取1 (3x3 内核)、2 (5x5 内核)或更高值。
      
          # percentile控制内核中所使用值的百分位数。默认情况下,每个像素都使用相邻的第五
          # 十个百分位数(中心)替换。使用最小滤波时,您可将此值设置为0,使用下四分位数滤
          # 波时设置为0.25,使用上四分位数滤波时设置为0.75,使用最大滤波时设置为1。
      img.median(1, percentile=0.5)
      
      # 图像锐化
      img.laplacian(1, sharpen=True)
      img.binary([green_threshold])
      img.to_grayscale(copy=False, rgb_channel=-1)
      ##图像二值化
          #img.find_edges(image.EDGE_CANNY, threshold = (50, 80))
      
      img.morph(kernel_size, kernel)
      img.dilate(1,threshold = 4)
      img.erode(1, threshold = 1)
          #img.close(16) #闭运算:连接断开的轮廓线,平滑其边界
      #矩形识别
          #rs = img.find_rects(threshold = 30000)
          #if rs:
              #num_r = 0
              #for r in rs:
                  #img.draw_rectangle(r.rect(), color = (255,0,0))
                  #num_r +=1
                  ##num_strr = '%d' %num_r
              ##uart.write('num_r =' +num_strr+'\r\n')
              #print(r.corners())
      
      #圆形识别
      while(True):
          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:
          num_y = 0
          for c in cs:
              img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))
              num_y += 1
                  #num_stry = '%d' %num_y
              #uart.write('num_y =' +num_stry+'\r\n')
          print(num_y)
          time.sleep_ms(100)
      
      


    • @kidswong999 我就是想相机不一直获取图片,就对同一张图片进行处理计数,然后又从原图像,图像处理,计数这个过程。现在是不是 每次循环都是 从图像处理过后的图片继续处理,而不是原图片反复处理。



    • 你不应该在for循环里draw_circle。
      因为draw函数是直接更改图片的像素值,所以每次循环都不是同一张图片。



    • 那我如果不用draw,直接识别就不影响了吧?



    • @zik3 对,你试试就知道了,把draw都注释掉。