OPENMV从入门到放弃

开始前,舵机零角度设置与小车正前方方向一致。开始时,舵机来回左右转动,摄像头检测是否识别到羽毛球,识别到就将舵机偏转角度通过串口发送给STM32控制小车前行捡球。

1.舵机控制
舵机使用前需要校准角度零点。使用时,如果舵机控制只用for循环一次就完成一次来回转动,帧率会很不稳定,画面会卡,将舵机控制分成多次循环才完成一次来回转动可以提高帧率及其稳定性。

2.羽毛球识别
多模板匹配帧率会很低,画面很卡。由于羽毛球角点较少,使用默认的AGAST特征点检测出的角点会很少,能与目标物体匹配的角点就更少。而用FAST特征点检测角点会较多,如果一个物体的特征点太多将导致帧率很低画面卡死,甚至RAM内存爆掉,同时角点也可能存在非目标物体角点。利用OPENCV自带的opencv_createsamples.exe和opencv_traincascade.exe训练得到HAAR级联分类器的文件,在OPENMV中使用时识别率很低。(可能是训练样本的原因)

最后,选择使用LAB阈值分割+滤波进行羽毛球识别。LAB是指亮度L(0到100)以及颜色通道A和B(-128到+127)。A包括的颜色是从深绿色到灰色再到亮品红色,B是从亮蓝色到灰色再到黄色。通过修改A和B分量的输出色阶做精确的颜色平衡,修改L分量来调整亮度对比。通过调节LAB分量,使图像中羽毛球为白色,其余背景色为黑色,即识别到羽毛球。通过使用识别的边界限定,识别物体的宽及高的和,识别物体的像素点数量与识别区域面积的密度比等方法进行滤波。

3.串口通信
OPENMV以数据包形式通过串口把数据发送到STM32,使用统一的通信协议,检测是否接收正确。STM32通过USART_SendData(USART_TypeDef* USARTx, uint16_t Data)函数发送数据,而OPENMV使用uart.readchar()函数接收。

OPENMV

import  time, math
from pyb import UART
import json
import ustructuart = UART(3,115200)   #定义串口3变量
uart.init(115200, bits=8, parity=None, stop=1) def sending_data(angle):global uartdata = ustruct.pack("<bbhb",              0x2C,                       #帧头10x12,                       #帧头2int(angle),                   #数据10x5B)uart.write(data)   #必须要传入一个字节数组
#使用ustruct模块序列化数据后,发送二进制数据。
#格式uart.write(ustruct.pack("<lhb", a_32_bit_value, a_16_bit_value, a_8_bit_value))def recive_data():global uartif uart.any():tmp_data = uart.readchar()print('openmv recive data:',tmp_data)

STM32

 s16 RxBuffer1[20];s8 RxCounter1=0;u8 RxFlag1=0;
//接收Openmv传过来的数据
void Openmv_Receive_Data(int16_t data)
{static u8 state = 0;  if(state==0&&data==0x2C)        //检测是否接收到帧头1{state=1;RxBuffer1[RxCounter1++]=data;}else if(state==1&&data==0x12)        //检测是否接收到帧头2{state=2;RxBuffer1[RxCounter1++]=data;}else if(state==2){RxBuffer1[RxCounter1++]=data;if(RxCounter1>20||data == 0x5B) state=3;   //检测是否接收到结束标志位}else if(state==3)      //检测是否接受到结束标志{if(RxBuffer1[RxCounter1-1] == 0x5B){state = 0;RxFlag1 = 1;USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);}else   //接收错误,清空,重新接收{state = 0;RxCounter1=0;}}    else   //接收错误,清空,重新接收{state = 0;RxCounter1=0;}
}//主循环处理函数
u16 USART2_Rx_Task(void)
{s16 posX;if(RxFlag1 == 1){   posX = RxBuffer1[3]<<8 | RxBuffer1[2];printf("X=%d\n",posX);RxFlag1 = 0;RxCounter1 = 0;USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);return posX;}return 0;
}//串口2中断处理函数
void USART2_IRQHandler(void)
{u8 temp;if( USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET ){USART_ClearITPendingBit(USART2,USART_IT_RXNE);    //清除中断标志temp = USART_ReceiveData(USART2);Openmv_Receive_Data(temp);    //openmv数据处理函数}
}

完整羽毛球训练例子工程文件请到https://download.csdn.net/download/qasxc78563/11329583下载
https://download.csdn.net/download/qasxc78563/11340903

OPENMV羽毛球识别相关推荐

  1. 2021电赛F题之openmv数字识别--更新(附带视频与代码)

    成果展示 常见出错解决方法 openmv数字识别源代码-gitee 效果如上 openmv的u盘里需要 思路: 模板匹配很简单,只不过使用起来需要自己拍摄大量的模板,同时如果模板数量较多那么就会造成严 ...

  2. ARDUINO + openmv 颜色 识别 工程训练大赛

    停车 识别三种颜色 通过串口 发送给arduino 进行处理..利用的是色块的横坐标 大小比较 从而将三种颜色 排列组合 到达排序效果 针对工程训练大赛 openmv 颜色识别 共享此代码 欢迎学习 ...

  3. 2021电赛F题智能送药小车方案分析(openMV数字识别,红线循迹,STM32HAL库freeRTOS,串级PID快速学习,小车自动返回)

    2021全国大学生电子设计竞赛F题智能送药小车 前提:本篇文章重在分享自己的心得与感悟,我们把最重要的部分,摄像头循迹,摄像头数字识别问题都解决了,有两种方案一种是openARTmini摄像头进行数字 ...

  4. openmv识别物体并与单片机通信(STM32)

    openmv识别物体并与单片机通信(STM32) OPENMV端 物体识别 感光元件 寻找色块 画图 距离判断 距离 实际距离 串口发送 STM32段 串口接收 串口2配置 数据处理 数据显示 Ope ...

  5. openmv与stm32之间的通信学习(数字识别)

    前提:软件安装与学习视频讲解 在我们使用openmv中的神经网络时,在新的版本里是没有nn的库给你调用的,需要在老版本里才有,百度云链接:https://pan.baidu.com/s/1bgLiLM ...

  6. 【毕业设计】基于STM32及OpenMV的云台追踪装置

    目录 修改记录 1.摘 要 2.整体功能分析 3.硬件选型 3.1 OpenMV4 Cam H7 3.2 STM32F103ZET6 3.3 DS3120舵机 3.4 LED补光板 3.5 供电及稳压 ...

  7. 基于stm32+amg8833+openmv实现的人脸跟随测温仪

    基于stm32+amg8833+openmv实现的人脸跟随测温仪 资料链接: 前言 概括 项目实物图 方案 AMG8833温度传感器驱动和目标温度的计算 openmv人脸识别部分 1 .云台舵机PID ...

  8. 2021电赛F题之openmv巡线(附代码)

    效果展示: 出错解决方法 openmv数字识别源代码–gitee 通过使用不同阈值的方法可以得到当前区域中什么区域有红线,对于电控而言作用类似于红外对管,之后电控通过逻辑判断如何运动,这就是我们队伍目 ...

  9. OpenMV激光打靶

    题目要求识别形状并且键盘设置控制激光笔走A,B,C等轨道. OpenMV需要识别图形形状.激光笔位置,以及提高要求中的识别形状的面积等. 这里介绍一下识别激光的方法,主要使用的是色块识别.但是激光点面 ...

最新文章

  1. laravel基础课程---8、laravel响应和视图(响应是什么)
  2. java弱引用怎么手动释放,Java 如何有效地避免OOM:善于利用软引用和弱引用
  3. html 5笔记:理解与学习
  4. java词类_英语词类浅谈
  5. SAP Cloud for Customer(C4C)前台显示的数据是如何从后台读取的
  6. Redis系列一、redis介绍与安装
  7. kendo Grid json解析的问题
  8. Python学习笔记之列表(四)
  9. 背景图片hover加蒙层_css3实现图片遮罩效果鼠标hover以后出现文字
  10. java之IO整理(下)
  11. 阻塞io阻塞io_面试官:直接IO、缓存IO、阻塞与同步?
  12. Linux部署之批量自动安装系统之DHCP篇
  13. QQ浏览器怎么关闭云加速 QQ浏览器云加速关闭方法
  14. (20200420已解决)InfluxDB时间显示格式
  15. 开始做公众号的一些方法技巧总结
  16. 张无忌当年究竟对她做了什么?走进爱恨情仇,探究他与她之间的瓜葛!
  17. python课程回顾复习记录简要6
  18. Mysql事务原理介绍
  19. 追风筝的人 第五章
  20. 合肥工业大学宣城校区计算机大赛,合工大宣城校区学子!全国冠军!

热门文章

  1. 微信和支付宝付款码条码规则
  2. 用计算机pol计算方位角,如何通过编程代替计算器内部函数“Pol和Rec”
  3. 基于LM358的几种外围电路
  4. c语言中怎么画直线,ps如何画直线 【操作流程】
  5. 单片机ch2o程序_基于单片机的甲醛浓度检测仪的设计_李娟娟
  6. 详解ELF重定向原理
  7. Blog-Freshman
  8. win10开启/取消自动关机
  9. scrapy链接mysql_Scrapy存入MySQL(四):scrapy item pipeline组件实现细节
  10. php 时间转时辰,女子十二时辰,最佳养颜作息时间表!(女人必看!)