• OpenMV VSCode 扩展发布了,在插件市场直接搜索OpenMV就可以安装
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 大佬您好,我想通过找直角来确定矩形的四个顶点,请问有什么办法来记录每次拍摄时最距离摄像头最近的两个直角的顶点吗?



    • enable_lens_corr = False # turn on for straighter lines...
      import sensor, image, time
      sensor.reset()
      sensor.set_pixformat(sensor.GRAYSCALE) # grayscale is faster
      sensor.set_framesize(sensor.QVGA)
      sensor.skip_frames(time = 2000)
      clock = time.clock()
      right_angle_threshold = (60, 90)
      binary_threshold = [(0, 180)]
      forget_ratio = 0.8
      move_threshold = 5
      k=0
      x=[0,0,0,0]
      y=[0,0,0,0]
      def calculate_angle(line1, line2):
          # 利用四边形的角公式, 计算出直线夹角
          angle  = (180 - abs(line1.theta() - line2.theta()))
          if angle > 90:
              angle = 180 - angle
          return angle
      
      
      def is_right_angle(line1, line2):
          global right_angle_threshold
          # 判断两个直线之间的夹角是否为直角
          angle = calculate_angle(line1, line2)
          if angle >= right_angle_threshold[0] and angle <=  right_angle_threshold[1]:
              # 判断在阈值范围内
              return True
          return False
      
      def find_verticle_lines(lines):
          line_num = len(lines)
          for i in range(line_num -1):
              for j in range(i, line_num):
                  if is_right_angle(lines[i], lines[j]):
                      return (lines[i], lines[j])
          return (None, None)
      
      
      def calculate_intersection(line1, line2):
          # 计算两条线的交点
          a1 = line1.y2() - line1.y1()
          b1 = line1.x1() - line1.x2()
          c1 = line1.x2()*line1.y1() - line1.x1()*line1.y2()
      
          a2 = line2.y2() - line2.y1()
          b2 = line2.x1() - line2.x2()
          c2 = line2.x2() * line2.y1() - line2.x1()*line2.y2()
      
          if (a1 * b2 - a2 * b1) != 0 and (a2 * b1 - a1 * b2) != 0:
              cross_x = int((b1*c2-b2*c1)/(a1*b2-a2*b1))
              cross_y = int((c1*a2-c2*a1)/(a1*b2-a2*b1))
              return (cross_x, cross_y)
          return (-1, -1)
      
      
      def draw_cross_point(cross_x, cross_y):
          img.draw_cross(cross_x, cross_y)
          img.draw_circle(cross_x, cross_y, 5)
          img.draw_circle(cross_x, cross_y, 10)
      
      old_cross_x = 0
      old_cross_y = 0
      
      while(True):
          clock.tick()
          img = sensor.snapshot()
          #img.binary(binary_threshold)
          lines =  img.find_lines(threshold = 2000, theta_margin = 20, rho_margin = 20, roi=(0, 0, 320,200))
          for line in lines:
              pass
             # img.draw_line(line.line(), color = (255, 0, 0))
          # 如果画面中有两条直线
          if len(lines) >= 2:
              (line1, line2) = find_verticle_lines(lines)
              if (line1 == None or line2 == None):
                  # 没有垂直的直线
                  continue
              # 画线
              #img.draw_line(line1.line(), color = (255, 0, 0))
              #img.draw_line(line2.line(), color = (255, 0, 0))
      
              # 计算交点
              (cross_x, cross_y) = calculate_intersection(line1, line2)
              print("cross_x:  %d, cross_y: %d"%(cross_x, cross_y))
      
              if cross_x != -1 and cross_y != -1:
                      if(k<4):
                          x[k]=cross_x
                          y[k]=cross_y
                          k=k+1
                      if(k==4):
                          xz=int((x[0]+x[1]+x[2]+x[3])/4)
                          yz=int((y[0]+y[1]+y[2]+y[3])/4)
                          draw_cross_point(xz, yz)
                          k=0
      
      


    • 这个想通过找直角来记录矩形的四个顶点求平均,来找矩形的中心,但是我像通过找最低的两个直角顶点来求平均 ,以此确定整个矩形最低边的中心,但是不知道如何实现,请问大佬能指点一下吗?





    • @kidswong999 感觉帧率没有找线快



    • @kidswong999 这个如果是两个矩形叠加起来的话识别不准,能不能做成先测量一下距离,然后只检测那个距离平面的矩形