import sensor
import image
import time
import math
import pyb
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) # 320x240分辨率
sensor.set_auto_gain(False) # 关闭自动增益
sensor.set_auto_whitebal(False) # 关闭自动白平衡
sensor.skip_frames(time=1000) # 等待设置生效
# 初始化串口通信(连接云台控制器)
uart = pyb.UART(3, 115200, timeout_char=1000) # 波特率115200,根据实际连接调整
# 矩形检测参数
RECT_THRESHOLD = 3000 # 矩形检测阈值(值越大检测越严格)
MIN_RECT_AREA = 5000 # 最小矩形面积(像素)
ASPECT_RATIO = math.sqrt(2) # A4纸长宽比≈1.414
ASPECT_TOLERANCE = 0.2 # 长宽比容差
# 云台控制参数
MAX_OFFSET_X = 160 # 水平方向最大偏移量(图像中心到边缘)
MAX_OFFSET_Y = 120 # 垂直方向最大偏移量
SMOOTHING_FACTOR = 0.2 # 平滑滤波系数
# 历史位置记录(用于平滑滤波)
prev_offset_x = 0
prev_offset_y = 0
def calculate_center(rect):
"""计算矩形中心点坐标"""
# 使用矩形的x,y,w,h属性计算中心
center_x = rect.x() + rect.w() // 2
center_y = rect.y() + rect.h() // 2
return center_x, center_y
def send_to_gimbal(offset_x, offset_y):
"""通过串口发送偏移量给云台控制器"""
# 使用二进制协议提高传输效率
data = bytearray([0xFF,
(offset_x >> 8) & 0xFF, offset_x & 0xFF,
(offset_y >> 8) & 0xFF, offset_y & 0xFF])
uart.write(data)
# 调试信息(可选)
print("Offset: ({}, {})".format(offset_x, offset_y))
def is_a4_paper(rect):
"""判断矩形是否为A4纸(根据长宽比)"""
w, h = rect.w(), rect.h()
if w < h: # 确保w为长边
w, h = h, w
aspect = w / h
return abs(aspect - ASPECT_RATIO) < ASPECT_TOLERANCE
def get_rect_area(rect):
"""计算矩形面积(w*h)"""
return rect.w() * rect.h()
while True:
img = sensor.snapshot()
# 增强图像对比度(提高不同光照条件下的稳定性)
img.histeq(adaptive=True, clip_limit=3.0)
# 检测矩形
rects = img.find_rects(threshold=RECT_THRESHOLD)
if rects:
# 筛选符合条件的矩形(A4纸)
valid_rects = []
for rect in rects:
area = get_rect_area(rect)
if area > MIN_RECT_AREA and is_a4_paper(rect):
valid_rects.append(rect)
if valid_rects:
# 选择面积最大的矩形
largest_rect = max(valid_rects, key=get_rect_area)
# 计算中心点坐标
center_x, center_y = calculate_center(largest_rect)
# 绘制矩形和中心点
img.draw_rectangle(largest_rect.rect(), color=(255, 0, 0)) # 红色边框
img.draw_cross(center_x, center_y, color=(0, 255, 0), size=10) # 绿色中心点
# 计算与画面中心的偏移量
img_center_x = img.width() // 2
img_center_y = img.height() // 2
offset_x = center_x - img_center_x
offset_y = center_y - img_center_y
# 应用平滑滤波
filtered_x = int(SMOOTHING_FACTOR * offset_x + (1 - SMOOTHING_FACTOR) * prev_offset_x)
filtered_y = int(SMOOTHING_FACTOR * offset_y + (1 - SMOOTHING_FACTOR) * prev_offset_y)
prev_offset_x = filtered_x
prev_offset_y = filtered_y
# 发送控制指令给云台
send_to_gimbal(filtered_x, filtered_y)
else:
# 未检测到有效矩形,发送停止信号
send_to_gimbal(0, 0)
else:
# 未检测到任何矩形,发送停止信号
send_to_gimbal(0, 0)
time.sleep_ms(50) # 控制循环频率约20Hz
请在未检测到矩形时,让云台进行寻找,帮我生成新的代码