Método OpenMV infalible para identificar rectángulos, círculos y triángulos

1. Método del sitio web oficial

Use directamente find_circles() y find_rects() para identificar rectángulos y círculos, use la función find_lines() para encontrar tres líneas rectas y use ángulos interiores de triángulos y 180° para identificar triángulos.
find_circles() explicación detallada
inserte la descripción de la imagen aquí
find_rects() explicación detallada
inserte la descripción de la imagen aquí
find_lines() explicación detallada
inserte la descripción de la imagen aquí
认真看手册!认真看手册!认真看手册!重要问题说三遍!
Los parámetros asignados a la función tienen una gran influencia en el efecto de reconocimiento final, así que asegúrese de comprender los parámetros cuidadosamente y luego ajústelos con paciencia.
Cuando uso estas funciones, reconozco muchas o ninguna, la solución es procesar más o filtrar la imagen. En el caso de desorden de fondo, el error de reconocimiento de triángulos por este método será muy grande.

En segundo lugar, utilice el bloque de color de identificación

Mi método consiste principalmente en identificar el bloque de color, primero identificar el color y luego identificar la forma, y ​​reducir el alcance del juicio.
La explicación detallada de find_blobs() en el manual del sitio web oficial
utiliza principalmente la función blob.density() para devolver la densidad del bloque de color. Esto es igual a la cantidad de píxeles del parche de color dividido por el área del marco exterior. Para un rectángulo ortográfico, este valor debe ser igual a 1, para un círculo ortográfico, este valor debe ser igual a π/4, y para un triángulo ortográfico, debe ser inferior a 0,5. Pero la situación real es que la cámara no necesariamente lo enfrenta de frente, y la influencia de otros factores hace que este valor fluctúe hacia arriba y hacia abajo. La forma más efectiva de ajustar los parámetros es: primero imprima la densidad () del rectángulo, círculo y triángulo respectivamente, y luego determine los parámetros después de observar el rango aproximado.
el código se muestra a continuación:

def detect(max_blob):#输入的是寻找到色块中的最大色块
    row_data=[-1,-1]#保存颜色和形状
    print(max_blob.solidity())
  
    if max_blob.density()>0.84:
        row_data[0]=max_blob.code()
        img.draw_rectangle(max_blob.rect())
        row_data[1]=1#表示矩形

    elif max_blob.density()>0.6:
        img.draw_circle((max_blob.cx(), max_blob.cy(),int((max_blob.w()+max_blob.h())/4)))
        row_data[0]=max_blob.code()
        row_data[1]=2#表示圆形
    elif max_blob.density()>0.4:
        row_data[0]=max_blob.code()
        row_data[1]=3#表示三角形
    return row_data#返回的是两个值,颜色和形状

Está por aquí, pero siempre ha habido un problema: si el rectángulo está inclinado en un ángulo o girado, el valor de densidad calculado () está muy cerca de un círculo, y a veces se reconocerá como un círculo, pero si es bajado, será Reconocer círculos como rectángulos.
Después de ser guiado por un compañero de clase, aprendí que hay una función max_blob.solidity(), que no se menciona en Xingtong Technology. Esta función trabaja con la identificación de rectángulos.
Código definitivo:

def detect(max_blob):#输入的是寻找到色块中的最大色块
    row_data=[-1,-1]#保存颜色和形状
    print(max_blob.solidity())
  
    if max_blob.solidity()>0.9 or max_blob.density()>0.84:
        row_data[0]=max_blob.code()
        img.draw_rectangle(max_blob.rect())
        row_data[1]=1#表示矩形

    elif max_blob.density()>0.6:
        img.draw_circle((max_blob.cx(), max_blob.cy(),int((max_blob.w()+max_blob.h())/4)))
        row_data[0]=max_blob.code()
        row_data[1]=2#表示圆形
    elif max_blob.density()>0.4:
        row_data[0]=max_blob.code()
        row_data[1]=3#表示三角形
    return row_data #返回的是两个值,颜色和形状

Supongo que te gusta

Origin blog.csdn.net/weixin_52385589/article/details/126443973
Recomendado
Clasificación