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



    • # Blob Detection Example
      #
      # This example shows off how to use the find_blobs function to find color
      # blobs in the image. This example in particular looks for dark green objects.
      
      import sensor, image, time         #导入模块
      from pid import PID                   #导入PID控制模块
      from pyb import Pin, Timer      #导入引脚和定时器
      from pyb import UART
      import display
      
      uart = UART(3, 115200)
      lcd = display.SPIDisplay()  # Initialize the lcd screen.
      sensor.reset() # Initialize the camera sensor.
      sensor.set_pixformat(sensor.RGB565) # use RGB565.
      sensor.set_framesize(sensor.QQVGA2) # use QQVGA for speed.
      sensor.skip_frames(10) # Let new settings take affect.
      sensor.set_auto_whitebal(False) # turn this off.
      sensor.set_auto_gain(False) # turn this off.
      
      #################阈值定义################################
      fenbian_thresholds   = [ (0, 100, 18, 127, 10, 127),#000-红
                       (0, 46, -128, -13, 6, 127)  ,#001-绿
                       (0, 39, -128, 127, -128, -10) ]#020-蓝
      
      yidong_thresholds   = [ (44, 100, 15, 127, -9, 127),#000-红
                       (64, 100, -16, 3, 0, 127)  ,#001-绿
                       (65, 100, 6, 127, -128, -18) ]#020-紫
      #######################################################
      #########电机控制函数##############################################
      def run(left_speed, right_speed):
          if inverse_left==True:              #判断左轮是否需要反转
              left_speed=(-left_speed)
          if inverse_right==True:              #判断右轮是否需要反转
              right_speed=(-right_speed)
      
          #设置通道PWM,应改为串口发送
          l_speed="#006P"+str(int(abs(left_speed)))+"T1000!"
          uart.write(l_speed)
          r_speed="#007P"+str(int(abs(right_speed)))+"T1000!"
          uart.write(r_speed)
      
      #########寻找最大色块函数###########################################
      ####返回最大色块max_blob的blob参数######
      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
      
      ########变量定义###################################################
      
      fenbian_mode=0    #方块 分辨模式
      yidong_mode=000     #移动 分辨区域模式
      
      inverse_left=False  #将其更改为True以反转左轮
      inverse_right=False #将其更改为True以反转右轮
      
      size_threshold = 2000
      x_pid = PID(p=0.5, i=1, imax=100)
      h_pid = PID(p=0.05, i=0.1, imax=50)
      
      yidong_finish_flag=0
      ################################################################
      
      clock = time.clock() # Tracks FPS.
      
      #############主循环###############################################
      while(True):
      
          clock.tick() # Track elapsed milliseconds between snapshots().
            
          img = sensor.snapshot() #获取一张图片
          lcd.write(img)
          blobs = img.find_blobs([yidong_thresholds[0]])
          if blobs and yidong_mode == 000 and yidong_finish_flag==0 :     ##########分辨红色###########
              yidong_blobs = img.find_blobs([yidong_thresholds[0]])
              yidong_max_blob = find_max(yidong_blobs)
              img.draw_rectangle(yidong_max_blob[0:4]) #绘制矩形
              img.draw_cross(yidong_max_blob[5], yidong_max_blob[6]) #绘制中心十字
              print('test3')
              img.draw_string(10,10,"test3",scale=1.2,mono_space=False)
              if fenbian_mode == 0 :
                  max_blob = find_max(blobs)
                  x_error = max_blob[5]-img.width()/2     #计算x轴离中心点位置
                  h_error = max_blob[2]*max_blob[3]-size_threshold     #距离计算,计算色块面积-滤波面积
                  img.draw_string(10,50,f"x_error:{x_error}",scale=1.2,mono_space=False)
                  img.draw_rectangle(max_blob[0:4]) #绘制矩形
                  img.draw_cross(max_blob[5], max_blob[6]) #绘制中心十字
                  x_output=x_pid.get_pid(x_error,1)   #速度计算
                  h_output=h_pid.get_pid(h_error,1)   #速度计算
                  run(-h_output-x_output+1500,-h_output+x_output-1500)
                  print('test1')
                  print(-h_output-x_output+1500,-h_output+x_output-1500)
                  img.draw_string(10,30,"test1",scale=1.2,mono_space=False)
                  if yidong_max_blob[4]>=3000:
                      run(1500,1500)
                      fenbian_mode=1
                      yidong_finish_flag=1
      
      
          elif blobs and yidong_finish_flag==1 :      ##################进入分辨模式##################  色块像素大于3000进入
              for i in range (0,3) :
                  fenbian_blobs = img.find_blobs([fenbian_thresholds[i]])
                  if fenbian_blobs :
                      fenbian_max_blob = find_max(fenbian_blobs)
                      img.draw_rectangle(fenbian_max_blob[0:4]) #绘制矩形
                      img.draw_cross(fenbian_max_blob[5], fenbian_max_blob[6]) #绘制中心十字
                      print('test2')
                      img.draw_string(10,30,"test2",scale=1.2,mono_space=False)
      #    else:
      #        run(18,-18)     #寻找不到色块则原地自转
      
      #        if blobs and fenbian_mode==0 :
      #            max_blob = find_max(blobs)
      #            x_error = max_blob[5]-img.width()/2     #计算x轴离中心点位置
      #            h_error = max_blob[2]*max_blob[3]-size_threshold     #滤波,计算色块面积-滤波面积
      #            img.draw_string(10,10,f"x_error:{x_error}",scale=1.2,mono_space=False)
      
      #            img.draw_rectangle(max_blob[0:4]) #绘制矩形
      #            img.draw_cross(max_blob[5], max_blob[6]) #绘制中心十字
      
      #            x_output=x_pid.get_pid(x_error,1)   #速度计算
      #            h_output=h_pid.get_pid(h_error,1)   #速度计算
      #            run(-h_output-x_output,-h_output+x_output)
      #        else:
      #            run(18,-18)     #寻找不到色块则原地自转![0_1699003044429_IMG_20231103_171641.jpg](https://fcdn.singtown.com/73475913-7e75-4b5a-8299-e9410042ab90.jpg) 
      


    • 原因:img还没画线就直接发送到lcd了。
      解决办法:lcd.write(img)移到最下面。



    • 原来是这样!解决了,太感谢了