赞
踩
目录
前言:我是想做一下OpenMV追踪目标颜色的二维云台,这其中通信是我去年电赛遇到的难题,现在我把它分享出来。
❗❗❗:源码链接链接:https://pan.baidu.com/s/1A-lwarGYlRM31pa8ZRnoXg?pwd=cyy6
提取码:cyy6
OpenMV使用p4端口发送消息,且与32共地。32的GPIOA9连接串口工具的接收口RXD且与32共地,三个设备的电源单独给。
视觉的逻辑采用了番茄哥的思维(参考原文http://t.csdnimg.cn/yCY7s)
将图像分为5部分区域,在不同的区域发送不同的数据信号。
❗:这里为什么要对字符串进行操作呢,是为了与STM32数据格式有一致结尾标识,STM32好判断数据发送是否结束
- def get_region_code(blob):
- x, y, w, h = blob[0:4]
- cx = blob[5]
- cy = blob[6]
-
- # 判断物体所在的区域
- if x_1 <= cx <= x_2 and y_1 <= cy <= y_2:
- data_to_send = "0"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '0' # 中心区域
- elif cx < x_1 and cy < y_1:
- data_to_send = "1"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '1' # 左上区域
- elif cx < x_1 and cy > y_2:
- data_to_send = "2"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '2' # 左下区域
- elif cx > x_2 and cy < y_1:
- data_to_send = "3"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '3' # 右上区域
- elif cx > x_2 and cy > y_2:
- data_to_send = "4"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '4' # 右下区域
uart基本配置
- uart = UART(3, 115200)# 通信初始化配置
- uart.init(115200, bits=8, parity=None, stop=1)
- import sensor, image, time
- from pyb import UART
-
- CYY_threshold = (0, 100, -128, 127, 21, 127)
- #(100, 21, -128, 127, 33, 127)
- #(100, 0, -127, 127, 25, 127)
- #(20, 100, -128, 127, 5, 127)
- #(0, 100, -128, 127, 21, 127)
-
- uart = UART(3, 115200)# 通信初始化配置
- uart.init(115200, bits=8, parity=None, stop=1)
-
- sensor.reset() # 初始化摄像头
- sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
- sensor.set_framesize(sensor.QVGA) # 使用 QQVGA 速度快一些
- sensor.skip_frames(time=2000) # 跳过2000ms,使新设置生效,并自动调节白平衡
- sensor.set_auto_gain(False) # 关闭自动增益。在颜色识别中,一定要关闭白平衡。
- sensor.set_auto_whitebal(False) # 关闭白平衡。在颜色识别中,一定要关闭白平衡。
- clock = time.clock() # 追踪帧率
-
- def find_max(blobs):
- max_size = 0
- max_blob = None
- for blob in blobs:
- if blob.pixels() > max_size:
- max_blob = blob
- max_size = blob.pixels()
- return max_blob
-
- def get_region_code(blob):
- x, y, w, h = blob[0:4]
- cx = blob[5]
- cy = blob[6]
-
- # 判断物体所在的区域
- if x_1 <= cx <= x_2 and y_1 <= cy <= y_2:
- data_to_send = "0"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '0' # 中心区域
- elif cx < x_1 and cy < y_1:
- data_to_send = "1"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '1' # 左上区域
- elif cx < x_1 and cy > y_2:
- data_to_send = "2"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '2' # 左下区域
- elif cx > x_2 and cy < y_1:
- data_to_send = "3"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '3' # 右上区域
- elif cx > x_2 and cy > y_2:
- data_to_send = "4"
- data_to_send_with_return = data_to_send + "\r\n"
- uart.write(data_to_send_with_return)
- return '4' # 右下区域
-
- x_max = 320
- x_min = 0
- x_1 = 135 # 中心区域左边界
- x_2 = 175 # 中心区域右边界
-
- y_max = 240
- y_min = 0
- y_1 = 110 # 中心区域上边界
- y_2 = 130 # 中心区域下边界
- flag = 0 # 位置信息标志
-
- while(True):
- clock.tick() # Track elapsed milliseconds between snapshots().
- img = sensor.snapshot() # 从感光芯片获得一张图像
-
- blobs = img.find_blobs([CYY_threshold])
- if blobs:
- max_blob = find_max(blobs)
- img.draw_rectangle(max_blob[0:4]) # rect
- img.draw_cross(max_blob[5], max_blob[6]) # cx, cy
- flag = get_region_code(max_blob) # 获取区域代号
-
- print(clock.fps())
- print(f"Region Flag: {flag}")
该部分代码采用的正点原子哥的代码改的,他的配置哪些我本人不懂,我直接用的他的工程改的主函数的代码
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "key.h"
-
- int main(void)
- {
- u8 len;
-
- HAL_Init(); //初始化HAL库
- Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
- delay_init(72); //初始化延时函数
- uart_init(115200); //初始化串口
- LED_Init(); //初始化LED
- KEY_Init(); //初始化按键
-
- while(1)
- {
-
- if(USART_RX_STA&0x8000)
- {
- len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
- printf("\r\n您发送的消息为:\r\n");
- HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据
- while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET); //等待发送结束
- printf("\r\n\r\n");//插入换行
- USART_RX_STA=0;
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。