使用openmv实现识别任意物体(将opencv的xml模型转化为openmv的cascade模型并使用)

本文档介绍了如何在OpenMV上实现自定义物体识别,特别是口罩识别。通过将XML模型转换为Cascade文件,利用OpenMV的HaarCascade功能,实现了基于Python3的口罩检测程序,并分享了转换过程中的注意事项和代码示例。此外,还提供了一套转换工具和模型资源的下载链接。
摘要由CSDN通过智能技术生成

此需求来源于我需要在openmv上做物体识别,但是openmv固件里面自带模型只有人脸(限正脸)和眼镜等等几个,如何使得openmv可以识别其他复杂物体?
我搜到了这篇文章(感谢原博主):
OPENMV使用OPENCV的Haar Cascade的xml模型?

在这篇的指引下,我们可以在openmv的github仓库中发现,官方已经提供了将xml文件转换为cascade文件的python代码,在命令行中直接运行即可。
这里说明几个注意点:

  • 文章中博主提到的python2版本才可以转换,目前已经不存在这个问题,本人python3.6,window10下,可以成功转换

  • 转换过程中若有报错,则虽然在同目录下产生了cascade文件,但大概率是不能使用的,如果文件只有1kb,也大概率是不能使用的(说明没有数据嘛)
    在这里插入图片描述

  • 经过实践,xml文件源代码中,图片是20乘20 是能够成功转换并可用的必要不充分条件。也就是图片一定要20乘20,但20乘20的xml仍然有可能在转换过程中报错而使得模型不可用。
    在这里插入图片描述

  • 转换成功的cascade文件大小从10+k到100+k都有,这取决于xml的精度

下面附上一段简单的基于自转换文件识别人是否佩戴口罩的代码:(附带了一个串口发送识别物体坐标)

#by z5z5z5z56 2020.10

import sensor, time, image

from pid import PID
from pyb import UART
#串口收发
#usart3 tx p4-----pb11
#usart3 rx p5-----pb10
uart = UART(3, 115200)
uart.init(115200,bits=8,parity=None,stop=1)#8个数据位,一个停止位,无奇偶校验位


# Reset sensor
sensor.reset()
sensor.set_contrast(3)#设置相机图像对比度。-3至+3。
sensor.set_gainceiling(16)#设置相机图像增益上限。2, 4, 8, 16, 32, 64, 128。
# HQVGA and GRAYSCALE are the best for face tracking.
sensor.set_framesize(sensor.HQVGA)
sensor.set_pixformat(sensor.GRAYSCALE)
#注意人脸识别只能用灰度图哦

# Load Haar Cascade加载Haar算子(识别目标的模型)保存到face_cascade
# By default this will use all stages, lower satges is faster but less accurate.
#HaarCascade的第一个参数是模型,这个模型如果是自定义的,则引号内为模型文件的路径;也可以使用内置的haar模型,
#比如“frontalface” 人脸模型或者“eye”人眼模型。
#stages值未传入时使用默认的stages。stages值设置的小一些可以加速匹配,但会降低准确率。
#face_cascade = image.HaarCascade("frontalface", stages=25)#识别正脸
face_cascade = image.HaarCascade("mask.cascade", stages=13)#识别是否戴口罩

print(face_cascade)

# FPS clock
clock = time.clock()

def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob[2]*blob[3] > max_size:
            max_blob=blob
            max_size = blob[2]*blob[3]
    return max_blob


while (True):
    clock.tick()

    # Capture snapshot
    img = sensor.snapshot()

    # 这个方法搜索与Haar Cascade匹配的所有区域的图像,并返回一个关于这些特征的边界框矩形元组(x,y,w,h)的列表。
    # 若未发现任何特征,则返回一个空白列表。
    #thresholds越大,匹配速度越快,错误率也会上升。scale可以缩放被匹配特征的大小。
    objects = img.find_features(face_cascade, threshold=0.75, scale_factor=1.25)
    #矩形元组(x,y,w,h)
    # Draw objects,在找到的目标上画框,标记出来
    for r in objects:
        img.draw_rectangle(r)
    if objects:

      #输出坐标到串口
      output_str="[%d,%d]" % (objects[0][0]+objects[0][2]/2,objects[0][1]+objects[0][3]/2) #方式1
      #output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2
      uart.write(output_str+'\r\n')#传输数据最后加上’\r\n’是回车换行的意思,
      print('you send:',output_str)
    else:
      output_str="%d" % (0)
      uart.write(output_str+'\r\n')#传输数据最后加上’\r\n’是回车换行的意思,
      print('you send:',output_str)
      #print('not found!')
    # Print FPS.
    # Note: Actual FPS is higher, streaming the FB makes it slower.
    #print(clock.fps())

关于转换的python文件,一些xml基础识别模型(人侧脸、半身、全身、微笑等)以及转换教程的一套资料,也可以在这个链接下载

回答: 要使用OpenMV识别一个物体并定位其具体位置,可以通过以下步骤实现。首先,使用OpenMV物体识别功能来识别目标物体。可以使用OpenMV自带的模型,如人脸和眼镜等,或者使用OpenCV的Haar Cascadexml模型识别其他复杂物体\[2\]。然后,通过计算k1值来确定物体OpenMV的距离。根据已知长度和像素点个数,使用公式k = length * Lm来计算k1值\[1\]。接下来,通过计算k2和k3值来确定物体的实际长和宽。根据已知物体的实际长和宽以及像素,使用公式实际距离 = k * 直径的像素来计算k2和k3值\[1\]。最后,通过串口发送数据来定位物体的具体位置。可以使用pyb模块导入UART,并配置串口参数,然后将要发送的数据通过UART发送出去\[1\]。这样就可以使用OpenMV识别一个物体并定位其具体位置了。 #### 引用[.reference_title] - *1* [openmv识别物体并与单片机通信(STM32)](https://blog.csdn.net/qq_48764574/article/details/119205633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用openmv实现识别任意物体(将opencvxml模型转化openmvcascade模型使用)](https://blog.csdn.net/z5z5z5z56/article/details/109231021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [OpenMV(六)--STM32实现物体识别与手写数字识别](https://blog.csdn.net/qq_42580947/article/details/105923064)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值