球形识别
利用OpenMV和STM32完成球类识别
单片机部分
功能简述:
- PA1脚接收OpenMV,若检测到高电平(检测到球形物体),则点亮单片机开发板上的LED
流程图

由于代码主要涉及中断函数,主函数部分就一笔带过了
硬件初始化
时钟
- 初始化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部分
流程图

代码部分
"""
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]()








浙公网安备 33010602011771号