这段代码使用 MaixPy 库控制摄像头识别图像中的颜色,并根据识别结果控制 LED 灯的亮灭,实现了一种简单的自动驾驶辅助系统。

代码首先导入了所需的模块和库,并定义了一些变量和阈值。

import sensor, image, time
import lcd
from Maix import GPIO
from fpioa_manager import fm
import utime
#from pyb import UART
#uart = UART(3, 115200)
#**********颜色/ROI阈值**********#
THRESHOLD = (((0, 44, -6, 44, -50, 6))) # Grayscale threshold for dark things...
GRAYSCALE_THRESHOLD = [((255, 197))]
roi1=(190,70,10,10)
roi2=(250,154,10,10)
roi3=(130,70,10,10)
roi4=(250,98,10,10)
roi5=(250,56,10,10)
roi6=(130,84,10,10)
roi7=(150,70,10,10)
roi8=(150,84,10,10)
roi9=(170,70,10,10)
roi10=(250,224,10,10)
roi11=(280,224,10,10)
roi12=(220,224,10,10)

#寻找倒车平行的方向  3 个
roi13=(310,56,10,10)
roi14=(310,126,10,10)
roi15=(310,182,10,10)
#侧着停车的状态
roi16=(270,70,10,10)
roi17=(270,56,10,10)
roi18=(270,168,10,10)
roi19=(230,168,10,10)
roi20=(230,154,10,10)
#
#************变量************#
a_1=a_2=a_3=a_4=a_5=0
a_6=a_7=a_8=0
s1=s2=s3=s4=s5=s6=s7=s8=0
#**********摄像头参数**********#
sensor.reset()
sensor.set_vflip(True)
sensor.set_hmirror(True)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) # 80x60 (4,800 pixels) - O(N^2) max = 2,3040,000.
#sensor.set_windowing([0,20,80,40])
sensor.set_auto_whitebal(False)               # Create a clock object to track the FPS.
sensor.skip_frames(time = 2000)     # WARNING: If you use QQVGA it may take seconds
                                      # 打开水平镜像 如果是 01Studio 的 K210 不开启会导致画面方向与运动方向相反
fm.register(9, fm.fpioa.GPIO0)
fm.register(10, fm.fpioa.GPIO0)
fm.register(11, fm.fpioa.GPIO0)
LED_B = GPIO(GPIO.GPIO0, GPIO.OUT) #构建LED对象
LED_C = GPIO(GPIO.GPIO0, GPIO.OUT) #构建LED对象
LED_D = GPIO(GPIO.GPIO0, GPIO.OUT) #构建LED对象
lcd.init()

接下来对摄像头进行初始化设置,设置图像格式、帧大小和其他参数。

代码中定义了一个子函数 tongji(),用于统计图像中不同区域的颜色并进行处理。在函数中,使用 img.get_statistics() 方法获取指定区域的颜色统计信息,然后根据统计结果判断颜色是否为目标颜色,并将结果保存在相应的变量中。

#**********检测前方横线子函数**********#
i = 0
ans=0
a = [0,0,0,0]
def tongji():
  global a_1
  global a_2
  global a_3
  global a_4
  global a_5
  global a_6
  global a_7
  global a_8
  global a_9
  global a_10
  global a_11
  global a_12
  global a_13
  global a_14
  global a_15
  global a_16
  global a_17
  global a_18
  global a_19
  global a_20
  #**********1**********#
  statistics1=img.get_statistics(roi=(110,112,10,10))
  color_1=statistics1.l_mode()
  print('color_1:',color_1)
  if color_1==100:
    a_1=1
  else:
    a_1=0
  #**********2**********#
  statistics2=img.get_statistics(roi=(250,154,10,10))
  color_2=statistics2.l_mode()
  print('color_2:',color_2)
  if color_2==100:
    a_2=1
  else:
    a_2=0
  #**********3**********#
  statistics3=img.get_statistics(roi=(190,112,10,10))
  color_3=statistics3.l_mode()
  print('color_3',color_3)
  if color_3==100:
    a_3=1
  else:
    a_3=0
  #**********4**********#
  statistics4=img.get_statistics(roi=(250,98,10,10))
  color_4=statistics4.l_mode()
  print('color_4:',color_4)
  if color_4==100:
    a_4=1
  else:
    a_4=0
  #**********5**********#
  statistics5=img.get_statistics(roi=(250,56,10,10))
  color_5=statistics5.l_mode()
  print('color_5:',color_5)
  if color_5==100:
    a_5=1
  else:
    a_5=0
  #**********6**********#

  statistics6=img.get_statistics(roi=(130,84,10,10))
  color_6=statistics6.l_mode()
  print('color_6:',color_6)
  if color_6==100:
    a_6=1
  else:
    a_6=0
  #**********7**********#
  statistics7=img.get_statistics(roi=(150,70,10,10))
  color_7=statistics7.l_mode()
  print('color_7:',color_7)
  if color_7==100:
    a_7=1
  else:
    a_7=0
  statistics8=img.get_statistics(roi=(150,84,10,10))
  color_8=statistics8.l_mode()
  print('color_8:',color_8)
  if color_8==100:
    a_8=1
  else:
    a_8=0
  statistics9=img.get_statistics(roi=(170,70,10,10))
  color_9=statistics9.l_mode()
  print('color_9:',color_9)
  if color_9==100:
    a_9=1
  else:
    a_9=0
#roi10=(230,224,10,10)
#roi11=(250,224,10,10)
#roi12=(210,224,10,10)
  statistics10=img.get_statistics(roi=(230,224,10,10))
  color_10=statistics10.l_mode()
  print('color_10:',color_10)
  if color_10==100:
     a_10=1
  else:
     a_10=0
  statistics11=img.get_statistics(roi=(250,224,10,10))
  color_11=statistics11.l_mode()
  print('color_11:',color_11)
  if color_11==100:
     a_11=1
  else:
     a_11=0
  statistics12=img.get_statistics(roi=(210,224,10,10))
  color_12=statistics12.l_mode()
  print('color_12:',color_12)
  if color_12==100:
     a_12=1
  else:
     a_12=0

###################################################################
#roi13=(310,56,10,10)
#roi14=(310,126,10,10)
#roi15=(310,182,10,10)
  statistics13=img.get_statistics(roi=(310,56,10,10))
  color_13=statistics13.l_mode()
  print('color_13:',color_13)
  if color_13==100:
     a_13=1
  else:
     a_13=0
  statistics14=img.get_statistics(roi=(310,126,10,10))
  color_14=statistics14.l_mode()
  print('color_14:',color_14)
  if color_14==100:
     a_14=1
  else:
     a_14=0
  statistics15=img.get_statistics(roi=(310,182,10,10))
  color_15=statistics15.l_mode()
  print('color_15:',color_15)
  if color_15==100:
     a_15=1
  else:
     a_15=0
####################################################
#roi16=(270,70,10,10)
#roi17=(270,56,10,10)
#roi18=(270,168,10,10)
#roi19=(230,168,10,10)
#roi20=(230,154,10,10)
  statistics16=img.get_statistics(roi=(270,70,10,10))
  color_16=statistics16.l_mode()
  print('color_16:',color_16)
  if color_16==100:
     a_16=1
  else:
     a_16=0
  statistics17=img.get_statistics(roi=(270,56,10,10))
  color_17=statistics17.l_mode()
  print('color_17:',color_17)
  if color_17==100:
     a_17=1
  else:
     a_17=0
  statistics18=img.get_statistics(roi=(270,168,10,10))
  color_18=statistics18.l_mode()
  print('color_18:',color_18)
  if color_18==100:
     a_18=1
  else:
     a_18=0
  statistics19=img.get_statistics(roi=(230,168,10,10))
  color_19=statistics19.l_mode()
  print('color_19:',color_19)
  if color_19==100:
     a_19=1
  else:
     a_19=0
  statistics20=img.get_statistics(roi=(230,154,10,10))
  color_20=statistics20.l_mode()
  print('color_20:',color_20)
  if color_20==100:
     a_20=1
  else:
     a_20=0

  #*****发送的是7个点的数值*****#类似于7个传感器
  print('a_1',str(a_1))
  #uart.write('1a'+str(a_1)+'
'+'
')
  print('a_2:',a_2)
  #uart.write('2a'+str(a_2)+'
'+'
')
  print('a_3:',a_3)
  #uart.write('3a'+str(a_3)+'
'+'
')
  print('a_4:',a_4)
  #uart.write('4a'+str(a_4)+'
'+'
')
  print('a_5:',a_5)
  #uart.write('5a'+str(a_5)+'
'+'
')
  #print('a_6:',a_6)
  #uart.write('6a'+str(a_6)+'
'+'
')
  #print('a_7:',a_7)-+  #uart.write('7a'+str(a_7)+'
'+'
')
LED_B.value(0) #点亮LED
LED_C.value(0) #点亮LED
LED_D.value(0) #点亮LED

在主循环中,首先进行图像处理,包括镜像翻转、色彩校正和二值化处理。然后调用 tongji() 函数统计颜色信息,并根据统计结果控制 LED 灯的亮灭。最后通过 LCD 显示图像,并不断循环执行以上操作。

while( 1 ):
    i+=1
    if(i==3):
        a[1]=a[2]
        i=2
    #img = sensor.snapshot()
    #histogram = img.get_histogram()
    #Thresholds = histogram.get_threshold()
    #img.binary([(Thresholds.value(), 0)])
    img = sensor.snapshot().lens_corr(strength = 1.8, zoom = 1.0).binary([THRESHOLD])
    img.draw_rectangle(roi1)
    img.draw_rectangle(roi2)
    img.draw_rectangle(roi3)
    img.draw_rectangle(roi4)
    img.draw_rectangle(roi5)
    img.draw_rectangle(roi6)
    img.draw_rectangle(roi7)
    img.draw_rectangle(roi8)
    img.draw_rectangle(roi9)
    img.draw_rectangle(roi10)
    img.draw_rectangle(roi11)
    img.draw_rectangle(roi12)
    img.draw_rectangle(roi13)
    img.draw_rectangle(roi14)
    img.draw_rectangle(roi15)
    img.draw_rectangle(roi16)
    img.draw_rectangle(roi17)
    img.draw_rectangle(roi18)
    img.draw_rectangle(roi19)
    img.draw_rectangle(roi20)
    tongji()
    s1=a_1+a_2+a_3+a_4+a_5+a_6+a_7+a_8+a_9
    #+a_6+a_7
    a[i]=s1
    if s1 >= 5:#同时识别到了7个,意思就是识别到了横线
      if(a[i-1]<5):
        ans+=1
    print('   :ans',ans)
    if ans==2:
        LED_B.value(0) #点亮LED
        LED_C.value(0) #点亮LED
        LED_D.value(1) #点亮LED

    #if a_10 == 1:
        #LED_B.value(1) #点亮LED
        #LED_C.value(0) #点亮LED
        #LED_D.value(1) #点亮LED
    #if a_11 == 1:
        #LED_B.value(1) #点亮LED
        #LED_C.value(1) #点亮LED
        #LED_D.value(1) #点亮LED
    #if a_12 == 1:
        #LED_B.value(0) #点亮LED
        #LED_C.value(1) #点亮LED
        #LED_D.value(1) #点亮LED
    s2 = a_13+a_14+a_15
    if s2==3:
       LED_B.value(0) #点亮LED
       LED_C.value(1) #点亮LED
       LED_D.value(1) #点亮LED
    print('   s2:    ',s2)
    s3 = a_16+a_17+a_18+a_19+a_20
    if s3==5:
       LED_B.value(0) #点亮LED
       LED_C.value(1) #点亮LED
       LED_D.value(0) #点亮LED
    print('   s3:    ',s3)
    lcd.display(img)
    #lcd.display(img)
    #img.draw_string(270, 220, ans, color = (123, 145,156), scale = 2,mono_space = False)
    #else:
     # s2=a_1+a_2+a_3+a_6
     # if s2==5:
      #  uart.write('s2')  #两种T
      #s3=a_3+a_4+a_5+a_7
    #  if s3==5:
       # uart.write('s3')  #两种T

#(0, 16, -11, 8, -23, 20)

代码中注释部分是对每个变量和区域的说明,以及一些额外的功能代码,但是这些功能代码被注释掉了,所以实际运行时不会起作用。

这段代码实现了简单的自动驾驶辅助功能,可以识别前方横线,判断车辆是否处于倒车平行或侧着停车状态,并通过 LED 灯显示识别结果。代码使用了清晰的注释,并包含了必要的图像处理和颜色识别操作,可以作为学习 MaixPy 编程和图像处理的参考。

注意:

  • 该代码可能需要根据实际应用进行调整。
  • 代码中使用了一些自定义的 ROI 区域,需要根据实际情况进行修改。
  • 代码中使用了灰度阈值,可以根据实际需要进行修改。
  • 代码中注释掉的代码可以用来实现更多功能,例如通过 UART 发送识别结果。

推荐:

  • 尝试使用不同的摄像头和 LED 灯进行测试。
  • 尝试使用不同的图像处理方法,例如边缘检测或形状识别。
  • 尝试使用不同的颜色识别方法,例如 HSV 颜色空间或 LAB 颜色空间。
  • 尝试实现更多自动驾驶辅助功能,例如车道线识别或交通信号灯识别。
MaixPy 摄像头图像识别代码分析:自动驾驶辅助系统实现

原文地址: https://www.cveoy.top/t/topic/laku 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录