导航

    • 登录
    • 搜索
    • 版块
    • 产品
    • 教程
    • 论坛
    • 淘宝
    1. 主页
    2. mgse
    M
    • 举报资料
    • 资料
    • 关注
    • 粉丝
    • 屏蔽
    • 帖子
    • 楼层
    • 最佳
    • 群组

    mgse

    @mgse

    0
    声望
    5
    楼层
    396
    资料浏览
    0
    粉丝
    0
    关注
    注册时间 最后登录

    mgse 关注

    mgse 发布的帖子

    • 为什么我的OPENMV 4 plus 神经网络采集图片是这样的

      0_1691140800129_微信截图_20230804171928.png

      发布在 OpenMV Cam
      M
      mgse
    • RE: local variable referenced before assignment.

      @kidswong999 在 local variable referenced before assignment. 中说:

      global uart

      好的,十分感谢。

      发布在 OpenMV Cam
      M
      mgse
    • local variable referenced before assignment.
      import sensor, image, time
      import json
      from pyb import UART
      uart = UART(3, 9600)
      a=3
      B=3
      C=[(47, 100, 61, -27, 40, 109)]
      D=[]
      E=[]
      F=3
      thresholds = [(6, 47, 121, 6, 93, 6), # generic_red_thresholds
                    (47, 100, 61, -27, 40, 109), # generic_yellow_thresholds
                    (23, 69, 89, -12, -7, -63),
                    (20, 37, 20, 60, -1, 45),
                    (24, 36, -1, 20, -55, -25),
                    (30, 44, -46, -9, 7, 44),
                    (21, 100, 118, 19, 40, -116)] # generic_blue_thresholds
      def find_max(blobs):
          max_size=0
          for blob in blobs:
              if blob.pixels() > max_size:# blob.pixels()返回从属于色块(int)一部分的像素数量。
                  max_blob=blob
                  max_size = blob.pixels()
          return max_blob
      
      def x(D,B):
      
          while(B>2):
              clock.tick() # Track elapsed milliseconds between snapshots().
              img = sensor.snapshot() # Take a picture and return the image.
      
              blobs = img.find_blobs(D)
      
              if blobs:
                  print('视野中的色块数sum : %d'% len(blobs))
                  data=[]
      
                  # 寻找视野中最大的色块
                  max_blob=find_max(blobs)
      
                  # 框出最大的色块,并在中心画十字
                  img.draw_rectangle(max_blob.rect()) # rect
                  img.draw_cross(max_blob.cx(), max_blob.cy()) # cx, cy
      
                  # 将最大色块的中心坐标加在传输数组data[]后
                  data.append( (max_blob.cx(),max_blob.cy()) )
      
                  #{(1,22),(-3,33),(22222,0),(9999,12),(0,0)}
                  data_out = json.dumps(set(data))    # ujson.dumps(obj):返回表示为JSON字符串的 obj 。
                  B=1                             # set() 函数创建一个无序不重复元素集
          return max_blob.cx()
              #uart.write(data_out +'\n')
      
      
      
      
      def y(D,B):
      
       while(B>2):
          clock.tick() # Track elapsed milliseconds between snapshots().
          img = sensor.snapshot() # Take a picture and return the image.
      
          blobs = img.find_blobs([yellow_threshold])
      
          if blobs:
              print('视野中的色块数sum : %d'% len(blobs))
              data=[]
      
              # 寻找视野中最大的色块
              max_blob=find_max(blobs)
      
              # 框出最大的色块,并在中心画十字
              img.draw_rectangle(max_blob.rect()) # rect
              img.draw_cross(max_blob.cx(), max_blob.cy()) # cx, cy
      
              # 将最大色块的中心坐标加在传输数组data[]后
              data.append( (max_blob.cx(),max_blob.cy()) )
      
              #{(1,22),(-3,33),(22222,0),(9999,12),(0,0)}
              data_out = json.dumps(set(data))    # ujson.dumps(obj):返回表示为JSON字符串的 obj 。
              B=1
                                        # set() 函数创建一个无序不重复元素集
          return max_blob.cy()
      
      def zhua():                      #机器臂抓取
      
          uart.write('h')
          if uart.any():
              D=uart.readline()
              if D:
                 uart.write('j')
                 if uart.any():
                     D=uart.readline()
                     if D:
                        uart.write('e')
      
          return
      
      
      def qi():   #机器臂起
          uart.write('g')
          if uart.any():
             D=uart.readline()
             if D:
                uart.write('y')
                if uart.any():
                    D=uart.readline()
                    if D:
                      uart.write('e')
      
          return
      
      def fang():   #放物体
          uart.write('h')
          if uart.any():
              D=uart.readline()
              if D:
                 uart.write('j')
                 if uart.any():
                     D=uart.readline()
                     if D:
                        uart.write('f')
      
          return
      
      
      def chu():  #机器臂初始定义
          uart.write('g')
          if uart.any():
             D=uart.readline()
             if D:
                uart.write('y')
                if uart.any():
                    D=uart.readline()
                    if D:
                      uart.write('f')
          return
      
      
      
      
      def go(B):      #寻找到要找的物块后
          C=B
          uart.write('s')
          if x(B,3)<45:  #右转
             uart.write('b')
             if x(B,3)>45 and x(B,3)<55:
                      uart.write('s')
      
             if x(B,3)>55:   #左转
                  uart.write('c')
                  if x(B,3)>45 and x(B,3)<55:
                      uart.write('s')
      
             if y(B,3)<75:  #前进
                  uart.write('a')
                  if y(B,3)>75 and y(B,3)<95:
                      uart.write('s')
      
             if y(B,3)>95:  #后退
                  uart.write('d')
                  if y(B,3)>75 and y(B,3)<95:
                      uart.write('s')
      
             if x(B,3)>45 and x(B,3)<55:
                   if y(B,3)<75 and y(B,3)>95:
                      zhua()
                   else:
                       go(C)
      
          return
      
      
          while(a>2): #不断拍照
              clock.tick()
              img = sensor.snapshot().lens_corr(1.8) #拍摄一张照片,lens_corr函数用于非鱼眼畸变矫正,默认设置参数为1.8,
              for blob in img.find_blobs(thresholds,pixels_threshold=200,roi = (100,80,600,440),area_threshold=200):
              #openmv自带的寻找色块函数。
              #pixels_threshold是像素阈值,面积小于这个值的色块就忽略
              #roi是感兴趣区域,只在这个区域内寻找色块
              #are_threshold是面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉
                  print('该形状占空比为',blob.density())
      
                  uart.write('b')
                  if blob.density()>0.705:
                      uart = UART(3, 9600)
                      a=1
          
      
      
          
      sensor.reset() #初始化设置
      sensor.set_pixformat(sensor.RGB565) #设置为彩色
      sensor.set_framesize(sensor.SVGA) #设置清晰度
      sensor.skip_frames(time = 2000) #跳过前2000ms的图像
      sensor.set_auto_gain(False) # must be turned off for color tracking
      sensor.set_auto_whitebal(False) # must be turned off for color tracking
      clock = time.clock() #创建一个clock便于计算FPS,看看到底卡不卡
      sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的。
      sensor.set_auto_whitebal(False) #关闭白平衡。在颜色识别中,一定要关闭白平衡。
      
      
      # You may need to tweak the above settings for tracking green things...
      # Select an area in the Framebuffer to copy the color settings.
      
      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(10) # Let new settings take affect.
      sensor.set_auto_whitebal(False) # turn this off.
      clock = time.clock() # Tracks FPS.
      
      a=3
      while(a>2): #不断拍照
              clock.tick()
              img = sensor.snapshot().lens_corr(1.8) #拍摄一张照片,lens_corr函数用于非鱼眼畸变矫正,默认设置参数为1.8,
              for blob in img.find_blobs(thresholds,pixels_threshold=200,roi = (100,80,600,440),area_threshold=200):
              #openmv自带的寻找色块函数。
              #pixels_threshold是像素阈值,面积小于这个值的色块就忽略
              #roi是感兴趣区域,只在这个区域内寻找色块
              #are_threshold是面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉
                  print('该形状占空比为',blob.density())
      
                  uart.write('b')
                  if blob.density()>0.805:
                      uart = UART(3, 9600)
                      a=1
      
      while(a>2): #不断拍照
              clock.tick()
              img = sensor.snapshot().lens_corr(1.8) #拍摄一张照片,lens_corr函数用于非鱼眼畸变矫正,默认设置参数为1.8,
              for blob in img.find_blobs(thresholds,pixels_threshold=200,roi = (100,80,600,440),area_threshold=200):
              #openmv自带的寻找色块函数。
              #pixels_threshold是像素阈值,面积小于这个值的色块就忽略
              #roi是感兴趣区域,只在这个区域内寻找色块
              #are_threshold是面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉
                  print('该形状占空比为',blob.density())
      
                  uart.write('b')
                  if blob.density()>0.705:
                      uart = UART(3, 9600)
                      a=1
          
      go(C)
      
      发布在 OpenMV Cam
      M
      mgse
    • RE: openmv4 plus在识别到颜色后卡住

      好的,十分感谢。

      发布在 OpenMV Cam
      M
      mgse
    • openmv4 plus在识别到颜色后卡住
      import time
      
      from pyb import Servo
      import sensor, image, time
      
      from pyb import UART
      
      #//导入需要的模块
      
      s1 = Servo(1) #//P7
      
      s2 = Servo(2) #// P8
      
      #s3 = Servo(3) #// P9 Only for OpenMV3 M7
      #//实例化3个舵机
      
      uart = UART(3, 115200)#//初始化串口
      
      s2_now = 60
      s1_now = 0
      
      
      red_threshold  = (21, 100, 36, 127, -9, 34)#//颜色阈值1   0001(14, 100, 8, 127, 9, 116)
      blue_threshold  = ((20, 67, -52, -13, -36, -1))#//颜色阈值2   0010
      yellow_threshold  = (36, 95, 17, -42, 17, 82)#//颜色阈值4    0100
      green_threshold  = (20, 100, -128, -24, 17, 127)#//颜色阈值8   1000
      
      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(10) #// Let new settings take affect.
      sensor.set_auto_gain(False) #// must be turned off for color tracking
      sensor.set_auto_whitebal(False) #// turn this off.
      clock = time.clock() #// Tracks FPS.
      
      
      #//以上部分是每个程序差不多都有的初始化设定
      
      def move(s1_error,s2_error):#//定义一个函数,作用是运动到目标物体位置
          kp=0.2
          global s2_now
          global s1_now #//global关键字 用于全局变量
      
          s1_move = s1_error*kp+s1_now#//pid计算
      
          if s1_move > 90:#//这4句限制舵机运动角度,防止卡死
              s1_move = 90
          if s1_move < -90:
              s1_move = -90
          #s1.angle(s1_move)#//这一句是输出pwm控制舵机,采用openmv控制舵机时需要,采用arduino时不需要
          s1_now = s1_move#//更新当前舵机角度存档
      
          if abs(s1_error)<10:
              s2_move = s2_error*kp+s2_now#//pid计算
              if s2_move > 60:#//这4句限制舵机运动角度,防止卡死
                  s2_move = 60
              if s2_move < 110:
                  s2_move = 110
                  s2.angle(s2_move)#//这一句是输出pwm控制舵机,采用openmv控制舵机时需要,采用arduino时不需要
                  s2_now = s2_move
         #// data.append((s2_now,s1_now))这三句时串口输出舵机应转的角度,采用openmv控制舵机时不需要,采用arduino时需要  data_out = json.dumps(set(data))  uart.write(data_out +'\n')
      
      def lay(shape,color):#//定义一个函数,用于把抓取的物品放到指定位置
          global s2_now#//global关键字 用于全局变量
          global s1_now
          angle = 0#//这个值表示目的角度
          if color == 1:#//根据颜色判断
              angle = 90
          else :
              angle = -90
          if shape > 0:#//根据形状判断
              if angle >0:
                  angle = angle - 30
              else:
                  angle = angle + 30
      
      
      #//下面是机械臂把物品放到指定angle对应位置,并回到初始位置
          for i in range(s2_now,-20,-1):
      
              s2.angle(i)
      
              time.sleep_ms(20)
      
          for i in range(s2_now,-20):
      
      
              s2.angle(i)
      
      
              time.sleep_ms(20)
      
      
         # for i in range(5,-19,-1):
      
      
             # s1.angle(i)
              #time.sleep_ms(10)
      
      
          for i in range(-20,-90,-1):
      
              s2.angle(i)
      
      
              time.sleep_ms(20)
      
      
          for i in range(s1_now,angle,-1):
      
              s1.angle(i)
      
      
              time.sleep_ms(20)
      
      
          for i in range(s1_now,angle):
      
      
              s1.angle(i)
      
      
              time.sleep_ms(20)
      
          for i in range(-90,-40):
      
              s2.angle(i)
      
      
              time.sleep_ms(20)
      
          #for i in range(-10,5):
      
      
           #   s1.angle(i)
            #  time.sleep_ms(10)
      
          time.sleep_ms(200)#//data.append((s2_now,s1_now))
          #//data_out = json.dumps(set(data))
          #//uart.write(data_out +'\n')
      
          for i in range(-20,-90,-1):
      
      
              s2.angle(i)
      
      
              time.sleep_ms(20)
      
          for i in range(angle,0,-1):
      
      
              s1.angle(i)
      
      
              time.sleep_ms(20)
      
      
      
          for i in range(angle,0):
      
      
              s1.angle(i)
      
      
              time.sleep_ms(20)
          time.sleep_ms(2000)
      
          s2.angle(-90)
          s2_now = -90
          s1_now = angle
         #//data.append((s2_now,s1_now))
         # //data_out = json.dumps(set(data))
         # //uart.write(data_out +'\n')
      
      
      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 find_max_c(blobs):#//定义一个找最大圆的函数,输入一个圆对象列表,输出一个圆对象
          max_size=0
          for blob in blobs:
              if blob[2] > max_size:
                  max_blob=blob
                  max_size = blob[2]
          return max_blob
      
      
      s1.angle(s1_now)#//初始化舵机
      s2.angle(s2_now)
      shape=0#//记录形状和颜色
      color=0
      time.sleep_ms(2000)
      #//下面是循环执行的部分
      while(True):
          clock.tick()  #Track elapsed milliseconds between snapshots().
          img = sensor.snapshot().lens_corr(1.8)#//拍摄一张照片,并畸变矫正
          claps = img.find_blobs([red_threshold])#//寻找色块
      
      
          if claps:
              clap=find_max(claps)
              img.draw_cross(clap.x(), clap.y(), color = (0, 255, 0), size = 10, thickness = 2)#//画一个十字
      
      
          #//寻找色块
          blobs = img.find_blobs([yellow_threshold,green_threshold], roi=(0,0,160,80),pixels_threshold=100, area_threshold=100,merge=True, margin=10)
          if blobs:#//如果找到了
              data=[]#//初始化数据
              blob=find_max(blobs)#//找最大
              color=blob.code()#//记录颜色
              img.draw_rectangle(blob.x(),blob.y(),blob.w(),blob.h(), color = (255, 255, 255), thickness = 2, fill = False)
              #//在色块周边一定范围内找圆
              circles= img.find_circles(threshold = 2600,r_min=10, x_margin = 10, y_margin = 10, r_margin = 10,
                          r_min = 2, r_max = 100, r_step = 2,roi=(blob.x(),blob.y(),blob.w(),blob.h()))
              #//在色块周边一定范围内找方
              rects = img.find_rects(threshold = 10000,roi=(blob.x(),blob.y(),blob.w(),blob.h()))
              if circles:
                  shape=shape+1
              if rects:
                  shape=shape-1
              #//上面两句会在一次抓取任务中对shape进行运算,shape表示该物品形状是圆还是方的概率,因此值理论上是-无穷到+无穷,实际不会太大,
              #//正数表示更可能为圆,负数表示更可能为方,绝对值越大可能性越高,可以把中间值改成其他值以更好地提高准确率
              #//由于openmv不能每一次都准确识别,因此采用这种方式显著提高了准确率。
              tx=blob.cx()
              ty=blob.cy()
              #//s3_error = clap.cx()-tx//计算error
              #//s2_error = clap.cy()-ty
              s1_error = 78-tx#//计算error
              s2_error = 44-ty
              move(s1_error,s2_error)#//使用前面定义的函数
              if abs(s1_error)<10:
                  lay(shape,color)#//使用前面定义的函数
                  shape=0#//清除标志
                  color=0
      
      
              #//s1.angle(5)打开
              #//s1.angle(-10)闭合
              #//s2.angle(-90)前
              #//s2.angle(-20)后
              #//s3.angle(-90)左
              #//s3.angle(0)中
              #//s3.angle(90)右
      
      
      发布在 OpenMV Cam
      M
      mgse