发布网友 发布时间:2024-10-19 18:06
共1个回答
热心网友 时间:1分钟前
我们使用Openmv中的特征点检测进行数字识别,并通过设置红色阈值实现巡线,最后通过串口通信将数字及红线坐标发送给主控芯片。
一、Openmv实现数字识别
对于数字识别,最初我们尝试使用模板匹配,但发现过程复杂且准确率不高。因此,我们最终选择了特征点检测的方法。
1.关于模板匹配的思路:
我们首先通过方框检测找到数字卡片的外边框,然后对框内的图像进行模板匹配。这种方法比直接使用整张图像的准确度更高,但容易受到外界干扰,方框大小可能小于模板大小,导致程序无法正常运行。尽管我们增加了ROI的宽度和长度,但仍然会出现错误。经过测试,我们发现特征点匹配可以达到我们的要求。
2.关于特征点检测的思路:
我们通过检测图像特征点,并与保存在SD卡的模板进行比对,找到特征点数最多的模板,即为我们要找的数字。然后,我们通过比对一定次数,选择比对成功次数最多的数字作为最终识别结果。在小车任务实现中,我们采取了以下策略:
由于近端病房只使用数字1和2,因此我们只对这两个数字的特征点进行比对,而当小车到达远端病房时,对其他数字进行特征点比对,这样可以大大提高识别的准确性。
部分代码如下:
二、巡线
1.基本巡线
思路:将摄像头一帧图片的上半部分划分为三个平行的感兴趣区,在三个感兴趣区中分别寻找最大的红色色块,获得三个中心坐标。然后,给予其不同的权重后计算平均质心坐标,用此质心坐标计算得到巡线时的偏转角度。
只将一帧图片的上半部分是因为下半部分容易受到小车的阻挡或阴影干扰。
附上部分代码:
2.识别十字
我们通过判断图像左上方和右上方区域是否有红线来识别十字。如果左上角和右上角都有红色部分,那么我们认为小车到达十字路口处。
部分代码:
三、串口通信
1.数据打包
有人可能会问为什么不直接通过串口发送字符串然后使用sscanf来解析?串口发送字符串(ASCAII编码)的方式虽然简单,但解析不稳定,易丢数据。ASCAII编码易出错,缺乏纠错功能。因此,我采用二进制传输,整数直接发送,浮点数放大去除小数位,然后以C语言的int,short,char的拆分逐8位形式逐位发送。接收后先计算校验累加,再重组。这种方式长期使用稳定可靠。
这样发出来的数据(int,short型)都是低位的字节在前,比如发送整型数9,得到的数据为(0x09 0x00 0x00 0x00)
附上代码:
2.Openmv及STM32的串口通信
直接附上STM32解码代码:
总结
Openmv功能强大,不仅可以用于图像识别处理,其他功能大家可以去星瞳科技官网学习,里面有例程讲解和丰富的资料。
热心网友 时间:2分钟前
我们使用Openmv中的特征点检测进行数字识别,并通过设置红色阈值实现巡线,最后通过串口通信将数字及红线坐标发送给主控芯片。
一、Openmv实现数字识别
对于数字识别,最初我们尝试使用模板匹配,但发现过程复杂且准确率不高。因此,我们最终选择了特征点检测的方法。
1.关于模板匹配的思路:
我们首先通过方框检测找到数字卡片的外边框,然后对框内的图像进行模板匹配。这种方法比直接使用整张图像的准确度更高,但容易受到外界干扰,方框大小可能小于模板大小,导致程序无法正常运行。尽管我们增加了ROI的宽度和长度,但仍然会出现错误。经过测试,我们发现特征点匹配可以达到我们的要求。
2.关于特征点检测的思路:
我们通过检测图像特征点,并与保存在SD卡的模板进行比对,找到特征点数最多的模板,即为我们要找的数字。然后,我们通过比对一定次数,选择比对成功次数最多的数字作为最终识别结果。在小车任务实现中,我们采取了以下策略:
由于近端病房只使用数字1和2,因此我们只对这两个数字的特征点进行比对,而当小车到达远端病房时,对其他数字进行特征点比对,这样可以大大提高识别的准确性。
部分代码如下:
二、巡线
1.基本巡线
思路:将摄像头一帧图片的上半部分划分为三个平行的感兴趣区,在三个感兴趣区中分别寻找最大的红色色块,获得三个中心坐标。然后,给予其不同的权重后计算平均质心坐标,用此质心坐标计算得到巡线时的偏转角度。
只将一帧图片的上半部分是因为下半部分容易受到小车的阻挡或阴影干扰。
附上部分代码:
2.识别十字
我们通过判断图像左上方和右上方区域是否有红线来识别十字。如果左上角和右上角都有红色部分,那么我们认为小车到达十字路口处。
部分代码:
三、串口通信
1.数据打包
有人可能会问为什么不直接通过串口发送字符串然后使用sscanf来解析?串口发送字符串(ASCAII编码)的方式虽然简单,但解析不稳定,易丢数据。ASCAII编码易出错,缺乏纠错功能。因此,我采用二进制传输,整数直接发送,浮点数放大去除小数位,然后以C语言的int,short,char的拆分逐8位形式逐位发送。接收后先计算校验累加,再重组。这种方式长期使用稳定可靠。
这样发出来的数据(int,short型)都是低位的字节在前,比如发送整型数9,得到的数据为(0x09 0x00 0x00 0x00)
附上代码:
2.Openmv及STM32的串口通信
直接附上STM32解码代码:
总结
Openmv功能强大,不仅可以用于图像识别处理,其他功能大家可以去星瞳科技官网学习,里面有例程讲解和丰富的资料。