球形识别

利用OpenMV和STM32完成球类识别

单片机部分

功能简述:

  • PA1脚接收OpenMV,若检测到高电平(检测到球形物体),则点亮单片机开发板上的LED

流程图

img

由于代码主要涉及中断函数,主函数部分就一笔带过了

硬件初始化

时钟

  • 初始化RCC,开启外部高速晶振
    img
  • 按照如下方式配置时钟树
    img

配置GPIO及NVIC

  • 将PA1脚改为外部中断任意边沿触发模式,悬空态输入模式
    img
  • 使能1线外部中断
    img

由于该项目只需要使用一个中断,所以不需要考虑优先级问题

代码部分

  • 在1线外部中断写入以下内容
  /* USER CODE BEGIN EXTI1_IRQn 0 */
  //判断PA1处电平状态,若为高电平则点亮LED(LD2)
	if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)){
		HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
	}else{
		HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
	}
  /* USER CODE END EXTI1_IRQn 0 */

OpenMV部分

流程图

img

代码部分

"""
OpenMV圆形识别 - 快速版
功能:检测圆形,P1输出高电平
特点:运行速度快,适合实时控制
"""

import sensor
import image
import time
from machine import Pin

# 初始化
sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)  # 灰度图
sensor.set_framesize(sensor.QVGA)       # 320x240
sensor.skip_frames(time=1000)

# GPIO
output_pin = Pin('P1', Pin.OUT_PP)
output_pin.low()

# 检测参数
MIN_RADIUS = 15
MAX_RADIUS = 80
THRESHOLD = 1500

print("快速圆形检测启动...")
print(f"检测半径: {MIN_RADIUS}-{MAX_RADIUS}像素")

# 主循环
detection_count = 0
last_print_time = time.ticks_ms()

while True:
    # 捕获图像
    img = sensor.snapshot()

    # 检测圆形
    circles = img.find_circles(threshold=THRESHOLD,
                               r_min=MIN_RADIUS,
                               r_max=MAX_RADIUS)

    # 控制P1引脚
    if circles:
        output_pin.high()
        detection_count += 1
    else:
        output_pin.low()

    # 定期输出统计信息
    current_time = time.ticks_ms()
    if current_time - last_print_time > 2000:  # 每2秒打印一次
        print(f"检测次数: {detection_count}")
        last_print_time = current_time

    time.sleep_ms(20)  # 控制帧率

实验效果

  • 当未检测到球形物体,单片机的LED灯不点亮
    img
  • 当有球体/圆形物品进入摄像头视角即点亮单片机LED
    img
    img
posted @ 2026-03-16 18:02  奶龙大王  阅读(41)  评论(0)    收藏  举报