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



    • # vision distance - By: SingTown - Wed Jul 30 2025
      
      import sensor
      import time
      
      
      # 设置VGA画面,并裁剪中间的画面
      sensor.reset()
      sensor.set_pixformat(sensor.GRAYSCALE)
      sensor.set_framesize(sensor.VGA)
      sensor.set_windowing((200,240))
      sensor.skip_frames(time=2000)
      clock = time.clock() # Tracks FPS.
      
      CENTER_X = 200/2
      CENTER_Y = 240//2
      
      # 边框的真实长度,单位mm
      FRAME_WIDTH_MM = 170
      FRAME_HIGHT_MM = 245
      
      # 校准的数据
      # 例如: 当距离是1400mm时,边框宽度为82像素
      
      # DISTANCE_MM_1 = 1100
      # FRAME_WIDTH_PIXEL_1 = 104
      
      DISTANCE_MM_2 = 1520
      FRAME_WIDTH_PIXEL_2 = 69
      FRAME_HEIGHT_PIXEL_2 = 100·
      # DISTANCE_MM_3 = 1800
      # FRAME_WIDTH_PIXEL_3 = 64
      
      def find_center_min_blob(blobs):
          # 找中间最小的色块
          blob = None
          min_area = 100000
          for b in blobs:
              if abs(b.cx()-CENTER_X)+ abs(b.cy()-CENTER_Y) > 50:
                  continue
              if b.area() > min_area:
                  continue
              blob = b
              min_area = b.area()
          return blob
      
      def find_center_max_blob(blobs):
          # 找中间最大的色块
          blob = None
          max_area = 0
          for b in blobs:
              if abs(b.cx()-CENTER_X)+ abs(b.cy()-CENTER_Y) > 50:
                  continue
              if b.area() < max_area:
                  continue
              blob = b
              max_area = b.area()
          return blob
      
      while True:
          clock.tick()
          img = sensor.snapshot()
      
          # 找白色色块,黑色边框内部
          frames = img.find_blobs([(150,256)])
          frame_blob = find_center_min_blob(frames)
          if not frame_blob:
              print("NO FRAME")
              continue
      
          # 计算距离
          distance = DISTANCE_MM_2*FRAME_HEIGHT_PIXEL_2/frame_blob.h()
      
          # 缩小roi,避免黑框的黑边
          frame_roi = (frame_blob.x()+5, frame_blob.y()+5, frame_blob.w()-10, frame_blob.h()-10)
          if frame_roi[2] <= 0 or frame_roi[3] <= 0:
              print("ROI ERROR")
              continue
          print(frame_roi)
      
          # 找黑色色块,目标物体
          objs = img.find_blobs([(0,150)],roi=frame_roi)
          obj_blob = find_center_max_blob(objs)
          if not obj_blob:
              print("NO OBJS")
              continue
      
          # 计算物体边长
          obj_w_mm = obj_blob.w()/frame_blob.w()*FRAME_WIDTH_MM
      
          print(frame_blob.w(), frame_blob.h())
          print(obj_blob.density())
          if 0.9 < obj_blob.density() :
              print("矩形")
          elif 0.6 < obj_blob.density():
              print("圆形")
          elif 0.4 < obj_blob.density():
              print("三角形形")
          else:
              print("无法识别到形状")
      
          img.draw_string(10,10, "length:"+str(obj_w_mm)+"mm")
          img.draw_string(10,20, "distance:"+str(distance)+"mm")
          img.draw_rectangle(frame_blob.rect())
          img.draw_rectangle(obj_blob.rect())