当前位置:   article > 正文

23年电赛e题-->自动追踪系统openmv代码(讲解+视觉完整代码)_openmv电赛e题

openmv电赛e题

                openmv很常用了,会有几个很明显的问题,看不见,找不到红色激光。

                第四问找到的矩形,的四个点顺序不对,应该怎么描点(细分多少份好一点)。

这个就是问题了。

现在一个一个解决。

1.关于看不见的问题

  1. sensor.set_brightness(-3)
  2. sensor.set_contrast(-3)

调试这两个函数。

2.关于找到四个矩形框,四个点不是顺时针问题。

先是找矩形框:

  1. for i in range(10):
  2. img = sensor.snapshot().lens_corr(strength = 1.5, zoom = 1)
  3. #img.binary(heikuang)#.erode(1)
  4. for r in img.find_rects(threshold = 10000,roi=(75,5,191,203)):
  5. #img.draw_rectangle(r.rect(), color = (255, 0, 0))
  6. for p in r.corners():
  7. a+=1
  8. img.draw_circle(p[0], p[1], 5, color = (0, 255, 0))
  9. #print(p)
  10. if a<=4:
  11. dian.add(p)

我找10次就好了,然后画出来。

看找的对不对。

这块的代码就是对点进行排序。(思路是,x最小为第一个点,x最大为第三个点,y最大为第四个,y最小为第二个。)

完美解决!!! 

3.细分多少份。

我这里有绝妙的方法,我细分了无数份。---》我上面求出了矩形的四个点,并且·对他进行排序了。然后我就可以求出这,四条边的直线了,然后让直线·向内收缩,收缩到中心位置。

我的细分点为,目标点,红色点为当前值。我用当前值+1个像素,作为目标点的x,再把x代直线求y。就是完美的细分。

具体代码:

1. 给点求直线。 

2.求出直线并向内收缩

(我这里等分了,这个不用管,我在下面将这几个点画出来,看我找的对不对!!!)

 

 3.细分(我这里求目标点和现在点的差值,来进行换点!!!)

其实具体代码思路就那样,具体代码要靠自己去写。 

完整代码:

  1. # Untitled - By: 24882 - Tue Jun 25 2024
  2. heikuang =[(0, 107)]
  3. roi1=[(79,32,165,163),(81,12,401,404)]
  4. bai_se=0
  5. red = [(0, 60, 2, 68, 53, -24)]
  6. green=[(59, 85, -78, 23, -11, 60)]
  7. import sensor, image, time,pyb
  8. from pyb import Pin, ExtInt
  9. from pyb import LED
  10. from pyb import UART
  11. from pid import PID
  12. from machine import UART
  13. sensor.reset()
  14. sensor.set_pixformat(sensor.RGB565)
  15. sensor.set_framesize(sensor.QVGA)
  16. sensor.skip_frames(time = 20)
  17. sensor.set_hmirror(True)
  18. sensor.set_vflip(True)
  19. clock = time.clock()
  20. uart = UART(3, 115200)
  21. uart1 = UART(1, 115200)
  22. dian=set()
  23. a=0
  24. b=()
  25. c=()
  26. d=()
  27. e=0
  28. dian1=[]
  29. dian2=[]
  30. dian3=[]
  31. dian4=[]
  32. zuobiao=[]
  33. zhongjian=()
  34. def sending_data3(a1,a2,a3,a4,a5,a6,a7,a8):
  35. FH= bytearray([0x01,a1,a2,a3,a4,a5,a6,a7,a8,0x64])
  36. uart.write(FH)
  37. def sending_data1(a1,a2,a3,a4,a5,a6,a7,a8):
  38. FH= bytearray([0x01,a1,a2,a3,a4,a5,a6,a7,a8,0x64])
  39. uart1.write(FH)
  40. for i in range(10):
  41. img = sensor.snapshot().lens_corr(strength = 1.5, zoom = 1)
  42. #img.binary(heikuang)#.erode(1)
  43. for r in img.find_rects(threshold = 10000,roi=(75,5,191,203)):
  44. #img.draw_rectangle(r.rect(), color = (255, 0, 0))
  45. for p in r.corners():
  46. a+=1
  47. img.draw_circle(p[0], p[1], 5, color = (0, 255, 0))
  48. #print(p)
  49. if a<=4:
  50. dian.add(p)
  51. ge=0
  52. diyi=0
  53. def takeSecond(elem):
  54. return elem[0]
  55. sensor.set_pixformat(sensor.RGB565)
  56. z1x=0
  57. z1y=0
  58. z2x=0
  59. z2y=0
  60. z3x=0
  61. z3y=0
  62. z4x=0
  63. z4y=0
  64. k1=0
  65. b1=0
  66. k2=0
  67. b2=0
  68. k2=0
  69. b2=0
  70. k3=0
  71. b3=0
  72. k4=0
  73. b4=0
  74. def zhixianwai1(ax,ay,bx,by):
  75. global k1,b1
  76. k1=(ay-by)/(ax-bx)
  77. b1=ay-k1*ax
  78. def zhixianwai2(ax,ay,bx,by):
  79. global k2,b2
  80. k2=(ay-by)/(ax-bx)
  81. b2=ay-k2*ax
  82. def zhixianwai3(ax,ay,bx,by):
  83. global k3,b3
  84. k3=(ay-by)/(ax-bx)
  85. b3=ay-k3*ax
  86. def zhixianwai4(ax,ay,bx,by):
  87. global k4,b4
  88. k4=(ay-by)/(ax-bx)
  89. b4=ay-k4*ax
  90. def find_max(blobs):
  91. max_blob = 0
  92. max_size = 0
  93. for blob in blobs:
  94. if blob[4]>max_size:
  95. max_blob = blob
  96. max_size = blob[4]
  97. return max_blob
  98. i=0
  99. flaghuan=0
  100. countflag=0
  101. dian1x=0
  102. dian1y=0
  103. dian2x=0
  104. dian2y=0
  105. sensor.set_pixformat(sensor.RGB565)
  106. sensor.set_brightness(-3)
  107. sensor.set_contrast(-3)
  108. mode=0
  109. while(True):
  110. mode=2
  111. dian1=list(dian)
  112. dian1.sort(key=takeSecond)
  113. #print(dian1)
  114. img = sensor.snapshot().lens_corr(strength = 1.5, zoom = 1)*
  115. sorted_indices = sorted(enumerate(dian1), key=lambda x: x[1][0])
  116. sorted_matrix = [dian1[idx] for idx, _ in sorted_indices]
  117. z1x=sorted_matrix[0][0]
  118. z1y=sorted_matrix[0][1]
  119. z3x=sorted_matrix[3][0]
  120. z3y=sorted_matrix[3][1]
  121. sorted_indices2 = sorted(enumerate(dian1), key=lambda y: y[1][1])
  122. sorted_matrix2 = [dian1[idy] for idy, _ in sorted_indices2]
  123. z2x=sorted_matrix2[0][0]
  124. z2y=sorted_matrix2[0][1]
  125. z4x=sorted_matrix2[3][0]
  126. z4y=sorted_matrix2[3][1]
  127. zhixianwai1(z1x,z1y,z2x,z2y)
  128. dengfen1=abs(z2x-z1x)/3
  129. mubiao1x=z1x+dengfen1
  130. mubiao1y=mubiao1x*k1+b1+5
  131. mubiao2x=z1x+dengfen1*2
  132. mubiao2y=mubiao2x*k1+b1+5
  133. zhixianwai2(z2x,z2y,z3x,z3y)
  134. dengfen2=abs(z3x-z2x)/3
  135. mubiao3x=z2x+dengfen2
  136. mubiao3y=mubiao3x*k2+b2+5
  137. mubiao4x=z2x+dengfen2*2
  138. mubiao4y=mubiao4x*k2+b2+5
  139. zhixianwai3(z4x,z4y,z3x,z3y)
  140. dengfen3=abs(z2x-z1x)/3
  141. mubiao6x=z4x+dengfen3
  142. mubiao6y=mubiao6x*k3+b3-5
  143. mubiao5x=z4x+dengfen3*2
  144. mubiao5y=mubiao5x*k3+b3-5
  145. zhixianwai4(z1x,z1y,z4x,z4y)
  146. dengfen4=abs(z1x-z4x)/3
  147. mubiao8x=z1x+dengfen4
  148. mubiao8y=b4+mubiao8x*k4-5
  149. mubiao7x=z1x+dengfen4*2
  150. mubiao7y=b4+mubiao7x*k4-5
  151. img.draw_cross(int(mubiao1x),int(mubiao1y), size=1, color=(255,0,0))
  152. img.draw_cross(int(mubiao2x),int(mubiao2y), size=1, color=(255,0,0))
  153. img.draw_cross(int(mubiao3x),int(mubiao3y), size=1, color=(255,0,0))
  154. img.draw_cross(int(mubiao4x),int(mubiao4y), size=1, color=(255,0,0))
  155. img.draw_cross(int(mubiao5x),int(mubiao5y), size=1, color=(255,0,0))
  156. img.draw_cross(int(mubiao6x),int(mubiao6y), size=1, color=(255,0,0))
  157. img.draw_cross(int(mubiao7x),int(mubiao7y), size=1, color=(255,0,0))
  158. img.draw_cross(int(mubiao8x),int(mubiao8y), size=1, color=(255,0,0))
  159. #print(i)
  160. if (i==0):
  161. mubx=z1x
  162. muby=z1y
  163. are1 = img.find_blobs(green,roi=(0,0,317,237),merge=True)
  164. are0 = img.find_blobs(red,roi=(93,4,202,216),merge=True)
  165. blobs1 = find_max(are1)
  166. blobs0 = find_max(are0)
  167. if(blobs0):
  168. img.draw_rectangle(blobs0.rect(),color=(255,255,0))
  169. print(flaghuan)
  170. sending_data3(blobs0.cx(),blobs0.cy(),abs(int(mubx)),abs(int(muby)),0,0,0,0)
  171. if(abs(blobs0.cx()-z3x)<=10):
  172. flaghuan=1
  173. if(abs(blobs0.cy()-z4y)<=5):
  174. flaghuan=2
  175. if(abs(blobs0.cx()-z1x)<=5):
  176. flaghuan=0
  177. if((abs(blobs0.cx()-mubx)<=3) and(abs(blobs0.cy()-muby)<=3)):
  178. i=i+1
  179. if((blobs0.cx()>z1x)and(blobs0.cx()<z2x-5)and(flaghuan==0)):
  180. mubx=mubx+1
  181. muby=mubx*k1+b1+5
  182. if((blobs0.cx()>z2x-5)and(blobs0.cx()<z3x)and(flaghuan==0)):
  183. mubx=mubx+1
  184. muby=mubx*k2+b2+5
  185. if((blobs0.cy()<=z4y+1)and(blobs0.cy()>=z3y-10)and(flaghuan==1)):
  186. mubx=mubx-1
  187. muby=mubx*k3+b3-5
  188. if((blobs0.cy()<z4y+5)and(blobs0.cy()>z1y)and(flaghuan==2)):
  189. mubx=mubx-1
  190. muby=mubx*k4+b4-5
  191. dian2x=blobs0.cx()
  192. dian2y=blobs0.cy()
  193. else :
  194. dian2x=0
  195. dian2y=0
  196. if(blobs1):
  197. img.draw_rectangle(blobs1.rect(),color=(255,255,0))
  198. dian1x=blobs1.cx()
  199. dian1y=blobs1.cy()
  200. sending_data1(dian1x,dian1y,dian2x,dian2y,0,0,0,0)
  201. print(dian1x,dian1y,dian2x,dian2y,0,0,0,0)
  202. else:
  203. dian2x=0
  204. dian2y=0

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/993087
推荐阅读
相关标签
  

闽ICP备14008679号