OpenMV识别黑框和激光

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())

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值