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



    • import sensor, image, time, math,pyb
      import json
      from pyb import Pin, Timer,UART,LED
      
      green_led = LED(1)
      blue_led = LED(2)
      
      #rgb_gain_db=(-6.02073, -2.231719, -3.454361)
      sensor.reset() # Initialize the camera sensor.
      sensor.set_pixformat(sensor.RGB565) # use RGB565.
      sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
      sensor.skip_frames(time=2000) # Let new settings take affect.
      sensor.set_auto_gain(False)
      #sensor.set_auto_whitebal(False,rgb_gain_db)
      sensor.set_auto_whitebal(False)
      clock = time.clock()
      #red_threshold=(33, 78, 6, 52, -9, 62)
      #red_threshold=(33, 94, -84, -30, 9, 72)
      red_threshold=(100, 71, 127, -39, 89, -27)
      #白色
      uart = pyb.UART(3,500000,timeout_char=1000)#串口初始化
      #pyb.delay(10)
      
      # 注意!与find_qrcodes不同,find_apriltags 不需要软件矫正畸变就可以工作。
      
      # 注意,输出的姿态的单位是弧度,可以转换成角度,但是位置的单位是和你的大小有关,需要等比例换算
      
      # f_x 是x的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/3.984*656,这个值是用毫米为单位的焦距除以x方向的感光元件的长度,乘以x方向的感光元件的像素(OV7725)
      # f_y 是y的像素为单位的焦距。对于标准的OpenMV,应该等于2.8/2.952*488,这个值是用毫米为单位的焦距除以y方向的感光元件的长度,乘以y方向的感光元件的像素(OV7725)
      
      # c_x 是图像的x中心位置
      # c_y 是图像的y中心位置
      
      
      f_x = (2.8 / 3.984) * 160 # 默认值
      f_y = (2.8 / 2.952) * 120 # 默认值
      c_x = 160 * 0.5 # 默认值(image.w * 0.5)
      c_y = 120 * 0.5 # 默认值(image.h * 0.5)
      
      def degrees(radians):
          return (180 * radians) / math.pi
      
      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
      
      def high(x):
          x=x>>8
          return x
      
      def low(x):
          x=x&0xff
          return x
      
      
      while(True):
          clock.tick() # Track elapsed milliseconds between snapshots().
          img = sensor.snapshot() # Take a pv/.icture and return the image.
      
          blobs = img.find_blobs([red_threshold],pixels_threshold=200, area_threshold=3000)
          if blobs:
              blue_led.on()
              max_blob = find_max(blobs)
              red_x= int(max_blob[5]-img.width()/2)
              red_y= int(img.height()/2-max_blob[6])
              img.draw_rectangle(max_blob[0:4])
              img.draw_cross(max_blob[5], max_blob[6])
          else:
              red_x = red_y =0
      
      
          for tag in img.find_apriltags(fx=f_x, fy=f_y, cx=c_x, cy=c_y): # 默认为TAG36H11
              img.draw_rectangle(tag.rect(), color = (255, 0, 0))
              img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
              print_args = (tag.x_translation(), tag.y_translation(), tag.z_translation(), \
                 degrees(tag.x_rotation()), degrees(tag.y_rotation()), degrees(tag.z_rotation()))
              TX = int(tag.x_translation()*10)
              TY = int(tag.y_translation()*10)
              CZ = int(degrees(tag.z_rotation()))
          # 位置的单位是未知的,旋转的单位是角度
          if(img.find_apriltags()):
              Tx = TX
              Ty = TY
              Cz = CZ
      
          else:
              Tx = Ty =CZ =0
      
      
          uart.writechar(high(red_x))
          uart.writechar(low(red_x))
          uart.writechar(high(red_y))
          uart.writechar(low(red_y))
          uart.writechar(high(Tx))
          uart.writechar(low(Tx))
          uart.writechar(high(Ty))
          uart.writechar(low(Ty))
          uart.writechar(high(CZ))
          uart.writechar(low(CZ))
          uart.writechar(0x55)
          uart.writechar(0xAA)
          print("red_x",red_x,"red_y",red_y,"Tx",Tx,"Ty",Ty,"CZ",CZ)
      
      


    • 具体的问题是什么?

      “同时输出色块与APriltag的坐标”是什么意思?



    • 就是同时通过串口同时输出色块的坐标和标签的坐标,目前已经解决了



    • 请问可以发一下你的代码我参考一下吗,我写的错误太多了