MaixPy 摄像头图像识别代码分析:自动驾驶辅助系统实现
这段代码使用 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 颜色空间。
- 尝试实现更多自动驾驶辅助功能,例如车道线识别或交通信号灯识别。
原文地址: https://www.cveoy.top/t/topic/laku 著作权归作者所有。请勿转载和采集!