[2023 E-sports] La realización más simple del control de objetivo de movimiento y el sistema de seguimiento automático (pregunta E)

La idea de este programa es la más simple y no involucra algoritmos complejos: identifique el marco rectangular, marque el marco rectangular, emita las coordenadas y el punto central, calcule la longitud y controle el mecanismo de dirección para mover una longitud fija. Es solo como referencia para completar las funciones básicas, ¡no rocíe si no le gusta!

# Realice el control de objetivos de movimiento y el sistema de seguimiento automático

## Descripción general de la tarea
Este artículo presentará cómo usar la placa de desarrollo OpenMV y el mecanismo de dirección para construir un control de objetivos en movimiento y un sistema de seguimiento automático. El sistema incluye un sistema de control de posición de punto rojo que simula el movimiento del objetivo y un sistema de control de posición de punto verde que indica seguimiento automático. A través de la implementación de este artículo, podemos identificar el objetivo en la imagen, controlar el mecanismo de dirección para que se mueva a lo largo del objetivo y generar la posición central y la longitud del marco rectangular del objetivo.

## Preparación del hardware
1. Placa de desarrollo OpenMV H7 Plus
2. Puntero láser rojo y verde
3. Dos servos (conectados a la placa de desarrollo OpenMV)

## Conexión de hardware
Conecte los dos servos a los pines de servo de la placa de desarrollo OpenMV (elija según los pines reales).

## Configuración de la cámara
En el código, configuramos la cámara en resolución QVGA y formato RGB565.

import sensor, image, math, pyb

# 初始化相机
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

# 其他代码...

## Detección y seguimiento de objetivos (¡parte del código de detección de objetivos ha sido probada!)
### Función de búsqueda de rectángulos
Para identificar el rectángulo de destino en la imagen, necesitamos escribir una función de búsqueda de rectángulos. Esta función devolverá la segunda área rectangular más grande para que podamos encontrar la ubicación del objetivo.

# 寻找矩形函数,返回第二大的矩形区域
def find_second_largest_rectangle(blobs):
    max_area = 0
    max_blob = None
    second_max_area = 0
    second_max_blob = None

    for blob in blobs:
        area = blob.area()
        if area > max_area:
            second_max_area = max_area
            second_max_blob = max_blob
            max_area = area
            max_blob = blob
        elif area > second_max_area:
            second_max_area = area
            second_max_blob = blob

    return second_max_blob

## Bucle principal
En el bucle principal, adquiriremos imágenes continuamente y haremos detección y seguimiento de objetos.

while True:
    img = sensor.snapshot() # 获取图像
    blobs = img.find_blobs([black_threshold], pixels_threshold=200, area_threshold=200)

    if blobs:
        # 寻找第二大的矩形区域
        second_max_blob = find_second_largest_rectangle(blobs)
        if second_max_blob:
            img.draw_rectangle(second_max_blob.rect(), color=(255, 0, 0), thickness=4) # 绘制第二大的矩形框,颜色为红色

            # 其他代码...

## Control del servo
Para lograr el seguimiento del objetivo, necesitamos controlar el servo para que se mueva alrededor del rectángulo y regrese al centro. Aquí usamos `pyb.Servo()` para controlar el movimiento del servo.

# 舵机参数
servo_pan_pin = 1 # 舵机1的引脚编号
servo_tilt_pin = 2 # 舵机2的引脚编号
servo_pan = pyb.Servo(servo_pan_pin) # 初始化舵机1
servo_tilt = pyb.Servo(servo_tilt_pin) # 初始化舵机2
servo_speed = 50 # 舵机转动速度(0-100,越大越快)
servo_pan_range = (0, 180) # 舵机1转动范围(角度)
servo_tilt_range = (0, 180) # 舵机2转动范围(角度)

# 控制舵机沿着矩形框移动一圈,并回到中心点
for angle in range(servo_pan_range[0], servo_pan_range[1], servo_speed):
    servo_pan.angle(angle) # 控制舵机1水平旋转
    servo_tilt.angle(angle) # 控制舵机2垂直旋转
    pyb.delay(100) # 延时一段时间,控制舵机转动速度

# 将舵机回到中心点
servo_pan.angle((servo_pan_range[0] + servo_pan_range[1]) // 2)
servo_tilt.angle((servo_tilt_range[0] + servo_tilt_range[1]) // 2)

## Salida de resultados
Después de detectar el objetivo, mostraremos la posición central y la longitud del rectángulo objetivo. Al mismo tiempo, marcaremos la posición del rectángulo en la imagen. (Las coordenadas y la longitud de la prueba aún están relativamente preparadas)

# 获取矩形框的中心点坐标
x, y = second_max_blob.cx(), second_max_blob.cy()

# 计算矩形框的长度和宽度(单位:厘米)
width_cm = 2 * distance_cm * math.tan(math.radians(H_FOV / 2)) * (second_max_blob.w() / img.width())
height_cm = 2 * distance_cm * math.tan(math.radians(V_FOV / 2)) * (second_max_blob.h() / img.height())

# 输出矩形框的中心点坐标和长度(单位:厘米)
print("Rectangle Center Coordinates (cm): x={}, y={}".format(x, y))
print("Rectangle Width (cm): {}, Height (cm): {}".format(width_cm, height_cm))

# 绘制黄色圆点标记矩形框中心位置
img.draw_circle(x, y, 5, color=(255, 255, 0), thickness=2)

## Efecto de ejecución
Después de conectar el hardware, cargue el código en la placa de desarrollo OpenMV y ajuste los parámetros y la posición del servo. Después de ejecutar el código, verá que el servo se mueve a lo largo del rectángulo de destino y marca la posición y el centro del rectángulo en la imagen.

## Conclusión
A través de la implementación de este artículo, hemos construido con éxito un control de objetivos en movimiento y un sistema de seguimiento automático. Al usar la placa de desarrollo OpenMV y los servos, podemos identificar el objetivo en la imagen y controlar los servos para rastrear el objetivo.

## Enlace de referencia
1. Sitio web oficial de OpenMV: https://openmv.io/
2. Documento Pyb Servo: https://docs.openmv.io/library/pyb.Servo.html

Agradecemos sus valiosos comentarios y sugerencias para discutir el aprendizaje y la mejora juntos. ¡gracias por leer!

Supongo que te gusta

Origin blog.csdn.net/qq_33505204/article/details/132073790
Recomendado
Clasificación