OPENMV羽毛球识别

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 ustruct

uart = UART(3,115200)   #定义串口3变量
uart.init(115200, bits=8, parity=None, stop=1) 

def sending_data(angle):
    global uart
    data = ustruct.pack("

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羽毛球识别)