• 免费好用的星瞳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
      sensor.reset()
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QQVGA)
      sensor.skip_frames(time = 2000)
      sensor.set_auto_gain(False) #在色块检测模式下关闭自动补光
      from pid import PID
      from pyb import Servo
      clock = time.clock()
      from pyb import UART
      import ustruct
      enable_lens_corr = False
      """    #以下三排根据需求更改
      red_threshold_01 = ((35, 100, 41, 77, 24, 59));
      green_threshold_01 = ((50, 100, -80, -20, 8, 20));
      blue_threshold_01 = ((20, 100, -18, 18, -80, -30));
      """
      red_threshold_01 = ((35, 100, 41, 77, 24, 59));
      green_threshold_01 = ((50, 100, -80, -20, 8, 17));
      blue_threshold_01 = ((46, 95, -34, 19, -45, -11));
      thresholds = [(0, 50, -24,-1, -18, 6)]
      pan_pid = PID(p=0.07, i=0, imax=90) #脱机运行或者禁用图像传输,使用这个PID
      #tilt_pid = PID(p=0.05, i=0, imax=90) #脱机运行或者禁用图像传输,使用这个PID
      #pan_pid = PID(p=0.1, i=0, imax=90)#在线调试使用这个PID
      tilt_pid = PID(p=0.1, i=0, imax=90)#在线调试使用这个PID
      uart = UART(3,115200)
      uart.init(115200, bits=8, parity=None, stop=1)
      
      k=12400  #********************k的值需要实际计算*********   距离*像素宽 单位是厘米
      kk=0.326 #直径/像素宽  单位是厘米
      def sending_data(flag,cr,yell,k2,k4):
          global uart;
          data = ustruct.pack("<bbhhhhhb",     #b signed char  整数 1
                         0x2C,                 #h short  整数 2
                         0x12,                 #i int 整数  4
                         int(flag),
                         int(cr),
                         int(yell),
                         int(k2),
                         int(k4),
                         0x5B)
          uart.write(data);
      
      def find_max(blobs):
          max_size=0
          for blob in blobs:
              if blob[2]*blob[3] > max_size:
                  max_blob=blob
                  max_size = blob[2]*blob[3]
          return max_blob
      
      while(True):
          clock.tick()
          img = sensor.snapshot().lens_corr(1.8)
          blobs = img.find_blobs([red_threshold_01], pixels_threshold=100, area_threshold=100, merge=True, margin=10);
          blobs1 = img.find_blobs([green_threshold_01], pixels_threshold=100, area_threshold=100, merge=True, margin=10);
          blobs2 = img.find_blobs([blue_threshold_01], pixels_threshold=100, area_threshold=100, merge=True, margin=10);
          cx=0;cy=0;cr=0;flag=0;yellow=0;k2=0;k4=0;
          if blobs:
              yellow = 1; #R
          elif blobs1:
              yellow = 2; #G
          else:
              yellow = 3; #B
          print("yellow", yellow)
          for c in img.find_circles(threshold = 3500, x_margin = 10, y_margin = 10, r_margin = 10,r_min = 2, r_max = 100, r_step = 2):
              if yellow==1:
                  img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))
              elif yellow==2:
                  img.draw_circle(c.x(), c.y(), c.r(), color = (0, 255, 0))
              else :
                  img.draw_circle(c.x(), c.y(), c.r(), color = (0, 0, 255))
              cx = c.x();
              cy = c.y();
              cr = c.r();
              #k1=k/2/cr     #圆形实际长度=k/圆形直径的像素点长度
              k2=kk*2*cr  #距离=kk*圆形直径的像素点长度
              flag = 1;
              #print("距离为",k1,"厘米")
              print("直径为",k2,"厘米")
              time.sleep(100)
              print("圆形",c)
              break
          for r in img.find_rects(threshold = 15000):
              if yellow==1:
                  img.draw_rectangle(r.rect(), color = (255, 0, 0))
                  #for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (255, 0, 0))
              elif yellow==2:
                  img.draw_rectangle(r.rect(), color = (0, 255, 0))
                 # for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0))
              else:
                  img.draw_rectangle(r.rect(), color = (0, 0, 255))
                 # for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 0, 255))
              cx = int(r.x()+(r.w()/2))
              cy = int(r.y()+(r.h()/2))
              flag =2
              print(r)
              print("矩形: x:",r.x()+(r.w()/2),"y:",int(r.y()+(r.h()/2)))
              time.sleep(100)
              #k3=k/cx     #矩形实际长度=k/矩形像素点长度
              k4=kk*cx   #距离=kk*矩形直径的像素点长度
              #print("距离为",k3,"厘米")
              print("长度为",k4,"厘米")
              break
          for s in img.find_line_segments(merge_distance = 10, max_theta_diff = 10):
              if yellow==1:
                  img.draw_line(s.line(), color = (255, 0, 0))
              elif yellow==2:
                  img.draw_line(s.line(), color = (0, 255, 0))
              else:
                  img.draw_line(s.line(), color = (0, 0, 255))
              if flag==1:
                  break;
              elif flag==2:
                  break;
              print(s)
              print("三角形")
              num_segment=1
              flag =3
              time.sleep(1000)
              break
          if flag == 0:
                  print(flag)
          sending_data(flag,cr,yellow,k2,k4);
      
      


    • 解决办法:time.sleep改为time.sleep_ms

      原因,新的固件的api改了。