openmv4闪灯说明_OpenMV Cam

改了一下算法,大致是因为类型是float才输出不了的,将err_x转成int型就行了。但是Flag还是无法输出。

用write(Flag)也不行,改成数据用writechar(Flag)也不行

import sensor,time,pyb,math,time,utime,image

from pyb import Pin, Timer, UART

clock = time.clock() # Tracks FPS.

LINE_WIDTH = 10

THRESHOLD = 40

#屏幕尺寸

WIDTH = 160

HEIGHT = 120

ROI = (int((WIDTH-HEIGHT)/2),0,HEIGHT,HEIGHT)

XO = int((WIDTH-HEIGHT)/2)

CENTRAL_AREA = 20

#高度数据

highcnt = 0.0

high = 0

#xy平面误差数据

err_x = 0

err_y = 0

#超声波回调处理函数

def Ultrasound(line):

if(Echo.value()==1):

tim_count.init(prescaler=1799, period=1176)#打开定时器

if(Echo.value()==0):

global highcnt

tim_count.deinit()

highcnt = tim_count.counter()#计数

uart.writechar(0x55)

uart.writechar(0xAA)

uart.writechar(0x10)

uart.writechar(0x00)

uart.writechar(0x00)

uart.writechar(high>>8)

uart.writechar(high)

uart.writechar(err_x>>8)

uart.writechar(err_x)

uart.writechar(err_y>>8)

uart.writechar(err_y)

uart.writechar(Flag)

uart.writechar(0x00)

uart.writechar(0x00)

uart.writechar(0x00)

uart.writechar(0x00)

uart.writechar(0x00)

uart.writechar(0x00)

uart.writechar(0x00)

uart.writechar(0xAA)

print(high)

#超声波发射端口配置

timpwm = Timer(4, freq=60) #超声波60赫兹发射频率

ch1 = timpwm.channel(1, Timer.PWM, pin=Pin("P7"), pulse_width=80) #100us发射角

#超声波接收端口配置

tim_count = pyb.Timer(1) #定时器计数

extint = pyb.ExtInt('P0', pyb.ExtInt.IRQ_RISING_FALLING, pyb.Pin.PULL_DOWN,Ultrasound)#开启外部中断

Echo = Pin('P0', Pin.IN, Pin.PULL_DOWN)

#串口三配置

uart = UART(3, 115200)#115200

uart.init(115200, bits=8, parity=None, stop=1)

sensor.reset()

sensor.set_pixformat(sensor.GRAYSCALE)#设置灰度信息

sensor.set_framesize(sensor.QQVGA)#设置图像大小

#sensor.skip_frames(20)#相机自检几张图片

sensor.set_auto_whitebal(False)#关闭白平衡

while(True):

high = int(1.7*highcnt)

line_x1 = [0,0,0,0]

line_x2 = [0,0,0,0]

line_y1 = [0,0,0,0]

line_y2 = [0,0,0,0]

line_H = [0,0,0,0]

line_V = [0,0,0,0]

line_temp = [0,0,0,0]

line_num = 0

line_num_y = 0

line_num_x = 0

num_H = 0

num_V = 0

Flag = int(0)

weight = 0

clock.tick() # Track elapsed milliseconds between snapshots().

img = sensor.snapshot() # Take a picture and return the image.

#print(img.height())

#检测图形

# img_2=img.binary([(0,127)],invert = 1)

#image.binary(thresholds, invert=False)此函数将在thresholds内的

#图像部分的全部像素变为1白,将在阈值外的部分全部像素变为0黑。invert将图像

#的0 1(黑 白)进行反转,默认为false不反转。

# img_2.median(1, percentile=0.5)

# img_2.erode(2)

for i in range(int(HEIGHT/3)):

for j in range(int(HEIGHT/3)):

if img.get_pixel(i*3+XO,j*3) < 127 :

weight += 1

#print(img.get_pixel(i,j))

print(weight)

#下面开始检测特征线数(可去?)

img.find_edges(image.EDGE_CANNY, threshold=(50, 80)) # Find edges

lines = img.find_lines(roi = ROI,threshold = THRESHOLD) # Find lines.

# lines = img.find_lines(threshold = THRESHOLD)

img.draw_rectangle(ROI)

#for l in lines: img.draw_line(l, color=(127)) # Draw lines

#print(lines) # Note: Your OpenMV Cam runs about half as fast while

if len(lines) != 0:

#print(len(lines),lines)

for i in range(len(lines)):

#print(i)

if lines[i][0] == 0: #为横线时

if line_x1 == [0,0,0,0]: #横一无值时

line_x1 = list(lines[i])

elif abs(line_x1[1]-lines[i][1]) < LINE_WIDTH: #为标准横一线时

for j in range(4):

line_x1[j] = (i * line_x1[j] + lines[i][j])/(i+1)

else: #不为标准横一线时

if line_x2 == [0,0,0,0]: #横二无值时

line_x2 = list(lines[i])

elif abs(line_x2[3]-lines[i][3]) < LINE_WIDTH: #为标准横二线时

for j in range(4):

line_x2[j] = (i * line_x2[j] + lines[i][j])/(i+1)

#为其他横线时舍弃

elif lines[i][1] == 0: #为竖线时

if line_y1 == [0,0,0,0]: #竖一无值时

line_y1 = list(lines[i])

elif abs(line_y1[0]-lines[i][0]) < LINE_WIDTH: #为标准竖一线时

for j in range(4):

line_y1[j] = (i * line_y1[j] + lines[i][j])/(i+1)

else: #不为标准竖一线时

if line_y2 == [0,0,0,0]: #竖二无值时

line_y2 = list(lines[i])

elif abs(line_y2[2]-lines[i][2]) < LINE_WIDTH: #为标准竖二线时

for j in range(4):

line_y2[j] = (i * line_y2[j] + lines[i][j])/(i+1) #为其他竖线时舍弃

#为其他线时舍弃

line_all = [line_x1,line_y1,line_x2,line_y2]

for k in range(len(line_all)):

if line_all[k][2] == 140:

line_num_x += 1

if line_all[k][3] == 120:

line_num_y += 1

line_num = line_num_y + line_num_x

if line_num == 2:

if (line_num_y == 2) or (line_num_x == 2):

Flag_0 = '-'

else:

Flag_0 = '+'

elif line_num < 2:

Flag_0 = '-'

else:

Flag_0 = '+'

print(line_num)

#line_all = [line_x1,line_y1,line_x2,line_y2]

#print(line_all)

#下面开始检测横纵中线

if len(lines) != 0:

for i in range(len(lines)):

#print(len(lines),lines)

if lines[i][0] == 0: #为横线时

if line_H == [0,0,0,0]: #横一无值时

line_H = list(lines[i])

num_H += 1

elif abs(line_H[1]-lines[i][1]) < 3*LINE_WIDTH and abs(line_H[3]-lines[i][3]) < 3*LINE_WIDTH:

for j in range(4):

line_H[j] = (num_H * line_H[j] + lines[i][j])/(num_H+1)

num_H += 1

elif lines[i][1] == 0: #为竖线时

if line_V == [0,0,0,0]: #横一无值时

line_V = list(lines[i])

num_V += 1

elif abs(line_V[0]-lines[i][0]) < 3*LINE_WIDTH and abs(line_V[2]-lines[i][2]) < 3*LINE_WIDTH:

for j in range(4):

line_V[j] = (num_V * line_V[j] + lines[i][j])/(num_V+1)

num_V += 1

#print(line_x1)

if line_H == [0,0,0,0]:

line_H = [0,HEIGHT/2,(WIDTH-XO),HEIGHT/2]

if line_V == [0,0,0,0]:

line_V = [(XO+HEIGHT/2),0,(XO+HEIGHT/2),HEIGHT]

line_H = [ int(x) for x in line_H ]

line_V = [ int(x) for x in line_V ]

img.draw_line(line_H,127)

img.draw_line(line_V,127)

print(line_H)

print(line_V)

#找直线的交点(已完成)

if line_V[2] != line_V[0]:

central_x = -(line_V[0]*HEIGHT/(line_V[2]-line_V[0])+line_H[1])/((line_H[3]-line_H[1])/(WIDTH-XO)-HEIGHT/(line_V[2]-line_V[0]))

else:

central_x = line_V[0]

central_y = (line_H[3]-line_H[1])/(WIDTH-XO)*central_x+line_H[1]

img.draw_cross(int(central_x),int(central_y),color=191)

print(central_x)

print(central_y)

err_x = int(central_x - WIDTH/2)

err_y = int(central_y - HEIGHT/2)

#接下来是FLAG

if (abs((central_y - (HEIGHT/2)) < CENTRAL_AREA) and (abs(central_x - (WIDTH/2)) < CENTRAL_AREA)):

if Flag_0 == '+' :

if weight > 300 :

Flag = 0xFF #T

else:

Flag = 0x7F #L

elif Flag_0 =='-' :

Flag = 0x3F #I

else:

Flag = 0x00 #D

print(Flag)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值