• OpenMV VSCode 扩展发布了,在插件市场直接搜索OpenMV就可以安装
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 为什么图像的像素点少于某个值(且不为零)程序就会崩溃



    • 0_1563622715872_ec042037-a1d8-4631-994d-f0f79dbcf4ac-image.png

      import sensor, image, time
      from pyb import LED
      from pyb import UART,Timer
      import Message
      from pid import PID
      rho_pid = PID(p=5.0, i=0.1, d=0.3)   #控制rol
      theta_pid = PID(p=3.0, i=0.2)#控制yaw
      
      sensor.reset()
      sensor.set_pixformat(sensor.GRAYSCALE)
      sensor.set_framesize(sensor.QQQVGA)
      sensor.set_vflip(False)
      sensor.set_hmirror(False)
      sensor.skip_frames(time = 2000) # let auto-gain/auto-white-balance run before using images
      
      yanse=(0,100)
      
      class zhixian():
          angle=0
          yaw=0
          pitch=0
          magnitude=0
      
      a1=0
      a2=0
      b1=0
      b2=0
      c1=0
      c2=0
      last_x=0
      last_y=0
      
      rho=0
      angle=0
      yaw=0
      
      rho_err=0
      angle_err=0
      yaw_err=0
      
      clock = time.clock()
      lx=zhixian()
      i=0
      while True:
          clock.tick()
          img = sensor.snapshot().binary([yanse])#二值化
      
          i=0
          last_x=0
          last_y=0
          rho=0
          angle=0
          x=0
          y=0
          maxbo=0
          #blobs = img.find_blobs([(250,255)],merge=True)
          #for b in blobs :
              #if maxbo<b.pixels():
                  #maxbo=b.pixels()
          #if maxbo>20 :
      
          for l in img.find_lines(threshold = 1000, theta_margin = 50, rho_margin = 50) :
              i=i+1
              #if(min_degree <= l.theta()) and (l.theta() <= max_degree):
              if i==1:
                  #img.draw_line(l.line(), color = (255, 0, 0))
                  a1=l[3]-l[1];
                  b1=l[0]-l[2];
                  c1=l[2]*l[1]-l[0]*l[3];
              elif i==2 :
                  a2=l[3]-l[1];
                  b2=l[0]-l[2];
                  c2=l[2]*l[1]-l[0]*l[3];
              else:
                  img.draw_line(l.line(), color = (255, 0, 0));
      
          if i>1 :
              if((a1*b2-a2*b1)!=0 and (a1*b2-a2*b1)!=0):
                  img.draw_cross(int((b1*c2-b2*c1)/(a1*b2-a2*b1)),int((c1*a2-c2*a1)/(a1*b2-a2*b1)),10,color=[255,0,0]);
                  last_x=int((b1*c2-b2*c1)/(a1*b2-a2*b1));
                  last_y=int((c1*a2-c2*a1)/(a1*b2-a2*b1));
                  Message.UartSendData(Message.DotDataPack(last_y,last_x,0))
                  print(2,   last_x,   last_y  )
          elif i==1 :
              lines = img.get_regression([(255,255)],robust = True)
      
                 # print(lines.line())
                  #lx.yaw=lines.theta()
                  #lx.pitch=lines.rho()
                  #lx.magnitude=lines.magnitude()
      
                  #rho_err = abs(lines.rho())-img.width()/2
                  #if lines.theta()>90:
                      #angle_err = lines.theta()-180
                  #else:
                      #angle_err = lines.theta()
                  #if lines.magnitude()>8:
                      ##if -40<b_err<40 and -30<t_err<30:
                      #rho = rho_pid.get_pid(lines.rho(),1)         #正值->右移  rol
                      #angle = theta_pid.get_pid(angle_err,1)   #正值->右转  yaw
                  ##for ls in lines:
              rho=lines.rho()
              angle=lines.theta()
              Message.UartSendData(Message.DotDataPack(20,int(rho),int(angle)))
                  #print(1,    rho,   angle  )
          print(clock.fps())
      
      


    • 代码不对啊。
      如果get_regression没有找到,你的代码里的lines就是空的。空的自然没有rho和theta。
      另外,get_regression返回的是一条线,而不是很多线,所以应该是line而不是lines。

      参考代码:
      https://book.openmv.cc/project/follow-lines.html#调整参数,实现跟随