Openmv多色识别

问题描述:最近把F1的芯片改成了F4,而今天晚上在重新调试openmv进行小车物料颜色识别时只能识别一次颜色。奇怪的是之前STM32F103ZET6用的程序框架与现在是一致的,换回之前的程序内容也识别不到第二个颜色(因为在openmv的程序内加了识别到什么颜色的物料就闪什么颜色的灯,所以可以看到一直在闪单色而没有调到下一个颜色)。

 

 

 

解决过程:首先我用其他好的程序片段进行了移植,但效果一样,于是我反复单步调试,发现卡在了颜色识别接受这里,对多个值检测后发现USART_RX_STA2错误(用的正点的串口中断代码,中断内接收出错,即没有识别到颜色),颜色值也是错误的0xFFFF FFFDA。

 

 

一 单步调试(记得选择硬件仿真)

1b04c8c311e04f69b852c963db016ce7.png

 

 

二 调试后发现卡住的位置

首先在主函数中用 单步调试按钮2【之后的用简称】执行后发现是卡在了扫二维码这个函数,再用单步1进入后发现是USART_RX_STA2这条判断没有执行)

bd12e00f185846b387919677a00e4d9c.jpg

 然后我将值进行监测,发现得到的值是错误的

注意:在无法进入判断时可以先屏蔽判断,先执行里面的语句观察产生的改变defab9e8637f45b0a60ac3c1a6d53694.jpg

 这里观测到的值是0xFFFF FFFDA,但是串口接收到数据之后应该为物料颜色代码1 2 3中的一个,不符合条件而陷入死循环。(ps:图片是记录的视频中截图的有点模糊😳)

 

三 多次调试后回溯再分析

在多次单步执行后突然发现有一次刚好可以接收到正确数据,keil内颜色识别代码没有很大问题。

再到openmv写的代码中查看,发现实现颜色转换(表现就是闪下一个二维码代码颜色的灯)的并非keil内卡住的函数USART2_Process,而是openmv内number++到下一个颜色代码。

找到出问题的点在于keil与openmv接口处之后

【因为两边代码都分别单独用过,是好的,所以只可能是联动原因】

仅仅在USART_OUT()发送识别指令的前后加了500ms的延迟解决了问题。个人认为可能是M4芯片相比M3发送速度更快,而我设置的openmv波特率115200也比较高导致了频繁进入串口中断接收错误。

 

 

 

写在最后:解决方法感觉好简单,就是加了延迟,可是如果没有找到根本的原因就会卡在之前调试找出的函数处,而不会理清楚思路之后灵感迸发在串口发送指令的函数前后加个延迟就好了……以此为戒,理清楚 现象【没有识别第二个物料颜色→openmv闪单色光不变色】发生的原因比一顿乱造【移植又移植+单步调了又调】效率高得多。

 

 

### 使用OpenMV实现物料识别 #### 物料识别概述 物料识别是指通过图像处理技术来检测和分类不同类型的材料或物体。对于OpenMV而言,这一过程通常涉及颜色识别、形状分析以及模式匹配等方法[^3]。 #### 开发环境准备 为了能够顺利开展基于OpenMV的颜色识别实验,在开始之前需完成如下准备工作: - 安装并启动OpenMV IDE软件; - 将OpenMV设备连接至电脑USB端口,并确认其被正确识别; - 在IDE内加载预编写的Python脚本文件或将下面给出的例子直接输入到编辑器窗口中; #### 示例代码展示 以下是利用OpenMV进行简单物料(假设为红色物品)识别的一段Python程序: ```python import sensor, image, time # 初始化传感器设置 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) # 设置自动增益/白平衡关闭以固定色彩校准 sensor.skip_frames(time=2000) sensor.set_auto_gain(False) sensor.set_auto_whitebal(False) clock = time.clock() while(True): clock.tick() # 记录帧率时间戳 img = sensor.snapshot() # 获取当前画面快照 # 寻找图片内的红色区域(阈值范围可根据实际情况调整) blobs = img.find_blobs([(18, 90, 40, 120, -20, 127)], pixels_threshold=200, area_threshold=200, merge=True) if blobs: most_pixels = 0 largest_blob = None for blob in blobs: if blob.pixels() > most_pixels: most_pixels = blob.pixels() largest_blob = blob if largest_blob is not None: img.draw_rectangle(largest_blob.rect()) # 绘制矩形框住目标物 img.draw_cross(largest_blob.cx(), largest_blob.cy()) # 在中心画十字 print(clock.fps()) ``` 此段代码实现了对指定颜色(这里设定的是红色)的目标定位与跟踪功能,当发现符合条件的对象时会在屏幕上显示相应的轮廓线及质心位置[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值