import sensor, time , math , json, pyb, ustruct ,image ,lcd
from pyb import UART
# 初始化TFT180屏幕
lcd.init()
red_threshold = (30, 100, 15, 127, -40, 127) # 红色激光笔的颜色阈值
green_threshold = (9, 86, 10, 71, -2, 66) # 绿色十字的颜色阈值
black_threshold = (3, 100, -128, 127, -128, 127) # 黑色的颜色阈值,可以根据实际情况调整
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time=2000)
sensor.set_auto_gain(False)
sensor.skip_frames(20)
sensor.set_auto_exposure(False, exposure_us=3000)
sensor.set_auto_whitebal(False)
clock = time.clock()
uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1)
lcd.init() # Initialize the lcd screen.
ROI = [0 ,0 ,160 ,120]
# 移动平均滤波窗口大小
window_size = 3
corner_history = []
def moving_average(data, window_size):
if len(data) < window_size:
return data
return [sum(data[i:i+window_size])/window_size for i in range(len(data)-window_size+1)]
def find_blob_center(threshold):
blobs = img.find_blobs([threshold])
if blobs:
b = blobs[0]
cx = b.cx()
cy = b.cy()
return cx, cy
return None, None
def find_max(blobs):
max_size=0
for blob in blobs:
if blob.pixels() > max_size:
max_blob = blob
max_size = blob.pixels()
return max_blob
yici=0
while True:
clock.tick()
img = sensor.snapshot().replace(vflip=True, hmirror=True, transpose=False)
img.lens_corr(1.8) # 1.8的强度参数对于2.8mm镜头来说是不错的。
rotated_img = img.copy().rotation_corr(z_rotation=180) # 将图像旋转180度
statistics = rotated_img.get_statistics(roi=ROI) # 使用旋转后的图像进行颜色统计
laser_x, laser_y = find_blob_center(red_threshold)
#img.draw_rectangle((46, 27, 70, 70), color=(255, 0, 0)) #画出铅笔框
if laser_x is not None and laser_y is not None:
# 绘制绿色十字来表示激光笔的位置
img.draw_cross(laser_x, laser_y, color=(0, 255, 128))
# 发送数据,你可以根据需要自行编码数据
data1 = ustruct.pack("<bBBb", int(laser_x),int(laser_y),0xFE)
uart.write(data1)
print(laser_x,laser_y)
# 在图像中寻找矩形
for r in img.find_rects(threshold = 10000):
# 判断矩形边长是否符合要求
if r.w() > 20 and r.h() > 20:
# 在屏幕上框出矩形
img.draw_rectangle(r.rect(), color = (255, 0, 0), thickness = 2)
# 获取矩形角点位置
corner = r.corners()
# 添加角点到历史列表
corner_history.append(corner)
# 保持历史列表大小不超过窗口大小
if len(corner_history) > window_size:
corner_history.pop(0)
# 计算移动平均角点位置
avg_corners = [
(sum([corner[i][0] for corner in corner_history]) / len(corner_history),
sum([corner[i][1] for corner in corner_history]a) / len(corner_history))
for i in range(4)]
# 在屏幕上圈出移动平均的角点
for avg_corner in avg_corners:
img.draw_circle(int(avg_corner[0]), int(avg_corner[1]), 5, color=(0, 255, 0), thickness=2, fill=False)
# 打印移动平均角点坐标
avg_corner1 = avg_corners[0]
avg_corner2 = avg_corners[1]
avg_corner3 = avg_corners[2]
avg_corner4 = avg_corners[3]
avg_corner1_x = int(avg_corner1[0])
avg_corner1_y = int(avg_corner1[1])
avg_corner2_x = int(avg_corner2[0])
avg_corner2_y = int(avg_corner2[1])
avg_corner3_x = int(avg_corner3[0])
avg_corner3_y = int(avg_corner3[1])
avg_corner4_x = int(avg_corner4[0])
avg_corner4_y = int(avg_corner4[1])
if yici==0:
print("Moving Avg Corner 1 (x, y):", avg_corner1_x, avg_corner1_y)
print("Moving Avg Corner 2 (x, y):", avg_corner2_x, avg_corner2_y)
print("Moving Avg Corner 3 (x, y):", avg_corner3_x, avg_corner3_y)
print("Moving Avg Corner 4 (x, y):", avg_corner4_x, avg_corner4_y)
data2 = ustruct.pack("<bBBBBBBBBb", 0xFF, avg_corner1_x, avg_corner1_y,
avg_corner2_x, avg_corner2_y,
avg_corner3_x, avg_corner3_y,
avg_corner4_x, avg_corner4_y,
0xFE)
uart.write(data2)
yici=1
img.draw_cross(80, 60, color=(255, 0, 0)) # 中心位置绘制红色十字
img = img.to_rgb565()
# 显示到屏幕上
lcd.display(img)
#img.draw_cross(laser_x, laser_y, color=(0, 255, 128))
# 打印帧率
#print(clock.fps())
OpenMV识别黑框和激光
最新推荐文章于 2024-03-07 21:27:15 发布