OPENMV端
物体识别
感光元件
img = sensor.snapshot() #存储摄像头所拍摄的图像并保存在img变量中
寻找色块
blobs = img.find_blobs([red_thresholds]) #find_blobs函数可以找到色块。
find_blobs函数:此函数参数较多,一般只用第一个参数就可以找到需要的色块。thresholds是颜色的阈值,是一个列表,这个列表可以有多个颜色阈值。 一个颜色阈值的结构是这样的:
thresholds= (minL, maxL, minA, maxA, minB, maxB) #元组里面的数值分别是L A B 的最大值和最小值。
画图
image.draw_cross(x, y, size=5, color=White) #在图像中画一个十字
x,y:是坐标 size:是两侧的尺寸 color:画十字的颜色
image.draw_rectangle(rect_tuple, color=White) #在图像中画一个矩形框
rect_tuple 的格式是 (x, y, w, h) color:画矩形框的颜色 sensor-感光元件具体介绍 find_blobs函数具体介绍 画图具体介绍
距离判断
实际长度和摄像头里的像素成反比
距离
距离 = k / 直径的像素
K1 = 500 #每次改变物体,K值都要重新计算 K1 = 距离(25cm已知)*直径像素Lm(20)
Lm = (max_blob.w() + max_blob.h())/2 #色块的长与宽 直径像素点个数
length = K1 / Lm
实际距离
实际距离 = k * 直径的像素 相同距离测不同物体的宽和长的长度
K2 = 0.16 #实际距离 = k * 直径的像素,K2 = 实际大小(宽4cm已知)/宽像素b[2](25)
K3 = 0.16 #实际距离 = k * 直径的像素,K3 = 实际大小(长4cm已知)/长像素b[3](25)
width = K2 * max_blob.w()
height = K3 * max_blob.h()
k1值计算:先已知一个长度length ,在计算出直径像素点个数Lm 。根据公式得到k = lenght * Lm 计算出k1 。通过改变物体(与计算k1值的物体为同一个 )的距离就可以得到物体到openmv的距离。 k2,k3值计算:先得到一个已知物体的实际长和宽,在得到这个物体长和宽的像素。根据公式实际距离 = k * 直径的像素 来得到k2,k3 。改变不同的物体就可以知道该物体的实际长和宽。 OpenMV测距具体介绍 视频介绍
串口发送
from pyb import UART #模块导入
uart = UART(3,115200) #串口配置
uart.init(9600, bits=8, parity=None, stop=1)
data = bytearray([0xb3,0xb3,max_blob[5],max_blob[6],max_blob[3],0x0d,0x0a]) #要发送的数据
uart.write(data) #数据发送
openmv发送16进制数据需要转换为字节的形式,假设要发送 0x50,0x600,0x70,0x80这几个16进制数据代码如下:
uart = UART(3, 115200)
uart.init(9600, bits=8, parity=None, stop=1)
data=bytearray([0x50,0x60,0x70,0x80])
uart.write(data)
STM32段
串口接收
串口2配置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
USART_DeInit(USART2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2,&USART_InitStructure);
USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);
USART_Cmd(USART2,ENABLE);
数据处理
static u8 state = 0;
if(state == 0 && data == 0xb3)
{
state = 1;
openmv[0] = data;
}
else if(state == 1 && data == 0xb3)
{
state = 2;
openmv[1] = data;
}
else if(state == 2)
{
state = 3;
openmv[2] = data;
}
else if(state == 3)
{
state = 4;
openmv[3] = data;
}
else if(state == 4)
{
state = 5;
openmv[4] = data;
}
else if(state == 5)
{
state = 6;
openmv[5] = data;
}
else if(state == 6)
{
if(data == 0x0a)
{
state = 0;
LED0 =~ LED0;
openmv[6] = data;
Openmv_Data();
data = 0;
}
else if(data != 0x0a)
{
state = 0;
for(i = 0;i < 7;i++)
{
openmv[i] = 0x00;
}
}
}
else
{
state = 0;
data = 0;
LED0 = 1;
for(i = 0;i < 7;i++)
{
openmv[i] = 0x00;
}
}
数据显示
在oled上显示需要的数据
OLED_ShowString(0,0,"OpenMV-X:");
OLED_ShowNum(70,00,OpenMV_X,3,12);
OLED_ShowString(0,2,"OpenMV-Y:");
OLED_ShowNum(70,2,OpenMV_Y,3,12);
OLED_ShowString(0,4,"Distance:");
OLED_ShowNum(68,4,Distance,3,12);
OLED_ShowString(90,4,"cm");
Openmv与STM32连线
Openmv端:TXD(P4),RXD(P5),GND。TXD是发送端,RXD是接收端,GND是地线。 STM32端:TXD(PA2),RXD(PA3),GND。 如何连线:OpenMV的RXD连到STM32的TXD;OpenMV的TXD连到STM32的RXD;把OpenMV的GND与STM32的GND相连接。
实验现象
识别到红色物体 openmv打印输出数据 STM32还未接收到数据 STM32接收到数据并在oled上显示 注:当stm32上电后,oled上显示数据为0且红灯亮蓝灯灭,当openmv识别到物体并发送数据到stm32时,红灯亮蓝灯闪烁且oled实时显示数据;当openmv未识别到物体时,oled显示上次识别到的数据且红蓝灯亮。
在进行串口配置时,OpenMV和STM32的串口的波特率、奇偶位、停止位等都需要相同,否则传送数据不会成功。
源码获取
链接:https://pan.baidu.com/s/1Hq4cWenJRjNJk_m41umDdg 提取码:qpf7
|