OPENMV巡線轉彎代碼 優(yōu)化版2022.6.29
大四畢業(yè)了,用不到了,這幾天趁著閑優(yōu)化了一下,之前那個號寫的太復雜了
- OPENMV通過UART進行通信
- ROIS為5塊感性區(qū)域,在160x120范圍內(nèi)分為5塊,方便遇到路口和前方無道路的處理
- largest_blob為blob模塊[2]為色塊w,[3]為色塊h,官方docs上有說明
- 對out_str進行設置可看到串口輸出的內(nèi)容
- 然后就是一些變量有用沒用的自己使用的時候刪一下,這一份的邏輯還是存在問題的
- 本人將此代碼用于2021送藥小車復現(xiàn)配合K210數(shù)字識別復現(xiàn)成功
- 直接復制粘貼就能用,不能用的自己反思一下自己是不是啥都不會
import sensor, image, time, math,pyb
from pyb import Pin, Timer,UART
uart = pyb.UART(1,115200,timeout_char = 1000)#串口初始化
# Tracks a black line. Use [(128, 255)] for a tracking a white line.
Red_Thresholds = [(33, 61, 16, 85, 21, 69)]
ROIS = [ #[ROI, weight]越近,權重越大,在這里權值暫時不考慮
(30, 90, 100, 30, 0), #下面1
(40, 40, 80, 40, 0), #中間2
(30, 0, 100, 30, 0), #上面3 160 *120
(0, 20, 30, 100, 0), #左邊4
(130,20 , 30, 100, 0) #右邊5
]
weight_sum = 0
for r in ROIS: weight_sum += r[4] # r[4] is the roi weight.
#---------------------------------------攝像頭初始化-----------------------------------------#
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) #320*240
sensor.skip_frames(time=2000)
sensor.set_auto_gain(False) # 顏色追蹤關閉自動增益
sensor.set_auto_whitebal(False) # 顏色追蹤關閉白平衡
flag=0;
i=0; #記錄第幾行數(shù)據(jù)
j=0; #記錄直線數(shù)量
led=pyb.LED(3)#必要的時候進行紅外補光
cross_num = 0 #第幾個路口
cross_flag = 0 #轉彎的標志
back_flag = 0; #返回的標志
center_flag1 = 0 #區(qū)域標志
center_flag2 = 0
center_flag3 = 0
center_flag4 = 0
center_flag5 = 0
out_str1='';
clock = time.clock()
#幀率
old_img= sensor.snapshot().mean_pooled(4,4) # 160x120 -> 40x30,前一張照片
#定義一個定時發(fā)送數(shù)據(jù)的函數(shù)
def tick(timer):#we will receive the timer object when being called
global flag
flag=1
tim = Timer(4,freq=100) # create a timer object using timer 4 - trigger at 1Hz
tim.callback(tick) # set the callback to our tick function
#--------------------------------------while循環(huán)開始-----------------------------------------#
while(True):
pyb.LED(1).on()
if(flag==1):
img=sensor.snapshot()
img.lens_corr(1.5) # for 2.8mm lens...攝像頭畸變糾正
#--------------------------------------尋找紅色色塊的位置--------------------------------------#
#檢測色塊位置
for r in ROIS:
i=i+1;
blobs=img.find_blobs(Red_Thresholds, roi=r[0:4], merge=True,pixels_area=10) # r[0:4] is roi tuple.
if blobs:#如果找到了顏色塊
# Find the blob with the most pixels.
largest_blob = max(blobs, key=lambda b: b.pixels())
#print("0", largest_blob[0])
#print("1", largest_blob[1])
#print("2", largest_blob[2])
#print("3", largest_blob[3])
if(i==1):#下面矩形
if(largest_blob[2]>=5):#排除瑕疵點
if(largest_blob[3]>=5):
center_flag1=1;#下面的矩形找到的標志
img.draw_rectangle(largest_blob.rect())
img.draw_cross(largest_blob.cx(),largest_blob.cy(),2)
elif(i==2):#中間矩形
if(largest_blob[2]>=5):
if(largest_blob[3]>=5):
center_flag2=1;
img.draw_rectangle(largest_blob.rect())
img.draw_cross(largest_blob.cx(),largest_blob.cy(),2)
elif(i==3):#上面的矩形
center_flag3=2;#有找到,但是不符合要求
if(largest_blob[2]>=5):
if(largest_blob[3]>=5):
center_flag3=1;
img.draw_rectangle(largest_blob.rect())
img.draw_cross(largest_blob.cx(),largest_blob.cy(),2)
elif(i==4):#左邊的矩形找到了
if(largest_blob[2]>=5):
if(largest_blob[3]>=5):
center_flag4=1;
img.draw_rectangle(largest_blob.rect())
img.draw_cross(largest_blob.cx(),largest_blob.cy(),2)
elif(i==5):#右邊的矩形找到了
if(largest_blob[2]>=5):
if(largest_blob[3]>=5):
center_flag5=1;
img.draw_rectangle(largest_blob.rect())
img.draw_cross(largest_blob.cx(),largest_blob.cy(),2)
#--------------------------------------遇到的路口--------------------------------------#
if(center_flag2>0 and center_flag4>0 and center_flag5>0):
cross_num = cross_num + 1 #第幾個路口
#--------------------------------------前方無路--------------------------------------#
if(cross_num>0 and center_flag2==0 and center_flag4==0 and center_flag5==0 and center_flag3==0):
back_flag = 1
i=0;
out_str1+='%.d'% int(center_flag1); #直角標志位
out_str1+='%.d'% int(center_flag2); #直角標志位
out_str1+='%.d'% int(center_flag3); #直角標志位
out_str1+='%.d'% int(center_flag4); #直角標志位
out_str1+='%.d'% int(center_flag5); #直角標志位
out_str1+='%.4d'% int(cross_num); #路口標志位
out_str1+='%.d'% int(back_flag); #返回標志位
uart.write('s'+out_str1+'#')
print(out_str1)
#像素位移之和清零
turn_flag=0;
center_flag1 = 0 #區(qū)域標志
center_flag2 = 0
center_flag3 = 0
center_flag4 = 0
center_flag5 = 0
#數(shù)組清零
out_str1=''#清除之前的數(shù)據(jù)
flag=0;
#-----------------------------------串口打印數(shù)據(jù)-----------------------------------------#
文章來源地址http://www.zghlxwxcb.cn/news/detail-612010.html
文章來源:http://www.zghlxwxcb.cn/news/detail-612010.html
到了這里,關于OPENMV巡線轉彎代碼 適用于電賽優(yōu)化版2022.6.29的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!