import time
import os
from media.sensor import *
from media.display import *
from machine import FPIOA, UART
# 初始化系统组件
def init_system():
# 配置UART2引脚
fpioa = FPIOA()
fpioa.set_function(11, FPIOA.UART2_TXD)
fpioa.set_function(12, FPIOA.UART2_RXD)
# 初始化UART2,波特率115200,8位数据位,无校验,1位停止位
uart = UART(UART.UART2, baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE)
# 初始化摄像头
sensor = Sensor(width=1024, height=768)
sensor.reset()
sensor.set_framesize(width=1024, height=768) # 保持原分辨率
sensor.set_pixformat(Sensor.RGB565)
sensor.run()
# 初始化显示屏
Display.init(Display.ST7701, width=800, height=480, to_ide=True)
return sensor, uart
# 识别矩形并返回中心坐标
def detect_rectangle(img):
# 转换为灰度图
img_gray = img.to_grayscale(copy=True)
# 二值化处理
img_gray = img_gray.binary([(82, 212)]) # 保留原阈值参数
# 寻找轮廓
rects = img_gray.find_rects(threshold=10000)
if rects:
# 取面积最大的矩形
largest_rect = max(rects, key=lambda r: r.area())
# 获取矩形四个角点
corners = largest_rect.corners()
# 绘制矩形四条边
img.draw_line(corners[0][0], corners[0][1], corners[1][0], corners[1][1],
color=(0, 255, 0), thickness=5)
img.draw_line(corners[1][0], corners[1][1], corners[2][0], corners[2][1],
color=(0, 255, 0), thickness=5)
img.draw_line(corners[2][0], corners[2][1], corners[3][0], corners[3][1],
color=(0, 255, 0), thickness=5)
img.draw_line(corners[3][0], corners[3][1], corners[0][0], corners[0][1],
color=(0, 255, 0), thickness=5)
# 计算中心坐标
c_x = sum([corner[0] for corner in corners]) / 4
c_y = sum([corner[1] for corner in corners]) / 4
# 在图像上绘制中心点
img.draw_circle(int(c_x), int(c_y), 5, color=(0, 0, 255), thickness=-1)
return (c_x, c_y)
return None
def main():
sensor = None
uart = None
try:
print("矩形检测与串口通信系统启动")
sensor, uart = init_system()
sensor.run()
# 图像中心坐标 (1024x768分辨率)
img_center_x = 512
img_center_y = 384
print("矩形追踪系统启动")
while True:
os.exitpoint()
# 获取一帧图像
img = sensor.snapshot()
# 检测矩形
rect_center = detect_rectangle(img)
if rect_center:
c_x, c_y = rect_center
# 计算偏移量 (目标中心 - 图像中心)
dx = int(c_x - img_center_x)
dy = int(c_y - img_center_y)
# 在图像上显示偏移量
img.draw_string(10, 10, f"dx: {dx}, dy: {dy}", color=(255, 0, 0), scale=2)
# 通过UART发送数据到STM32,格式: "DX,dy\r\n"
try:
data = f"D{dx},{dy}\r\n"
uart.write(data.encode())
except Exception as e:
print(f"UART发送失败: {e}")
else:
# 未检测到矩形
img.draw_string(10, 10, "未检测到矩形", color=(255, 0, 0), scale=2)
try:
uart.write(b"None\r\n")
except Exception as e:
print(f"UART发送失败: {e}")
# 显示图像
Display.show_image(img)
time.sleep_ms(50) # 控制帧率
except KeyboardInterrupt:
print("用户终止程序")
except Exception as e:
print(f"发生错误: {e}")
finally:
# 资源释放
if uart:
uart.deinit()
print("UART已关闭")
if sensor:
sensor.stop()
print("传感器已停止")
Display.deinit()
print("显示屏已关闭")
os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
time.sleep_ms(100)
print("系统已关闭")
if __name__ == "__main__":
main()
所以代码哪里出现了问题,该怎么改
最新发布