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

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

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

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

  • 转换过程中若有报错,则虽然在同目录下产生了cascade文件,但大概率是不能使用的,如果文件只有1kb,也大概率是不能使用的(说明没有数据嘛)
    使用openmv实现识别任意物体(将opencv的xml模型转化为openmv的cascade模型并使用)_第1张图片

  • 经过实践,xml文件源代码中,图片是20乘20 是能够成功转换并可用的必要不充分条件。也就是图片一定要20乘20,但20乘20的xml仍然有可能在转换过程中报错而使得模型不可用。
    使用openmv实现识别任意物体(将opencv的xml模型转化为openmv的cascade模型并使用)_第2张图片

  • 转换成功的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基础识别模型(人侧脸、半身、全身、微笑等)以及转换教程的一套资料,也可以在这个链接下载

你可能感兴趣的:(机器视觉,计算机视觉,python)