Reconocimiento de coordenadas del histograma de la cámara K210

El primer proyecto de hardware con el que entré en contacto fue el diseño de un automóvil de visión inteligente simple. Mi tarea en el proyecto era identificar las coordenadas de seis puntos objetivo en una hoja de papel y enviarlas al automóvil.

Figura 1 Estilo del sitio

Es identificar las coordenadas de los seis puntos en la imagen de arriba y luego transmitirlas al automóvil.

El efecto de reconocimiento es probablemente así:

 Figura 2 Efecto de reconocimiento

Debido a que es la primera vez que hago un proyecto de este tipo, la primera vez que no soy competente en el uso de maixpy, espero que me perdonen y la finalización del proyecto cumpla con las expectativas.

La cámara K210 utiliza maixpyIDE especial para la edición. Está escrito en el lenguaje python, pero se siente que los requisitos de sangría son más estrictos y se ejecutará incorrectamente si no es una sangría de cuatro espacios.

Lo primero es importar:

import sensor,image,lcd,time

La importación no dice nada, dispositivo, imagen, pantalla, hora, nada más de importación especial.

Luego está la inicialización, porque nunca antes había tocado un proyecto de hardware, la inicialización es una inicialización común tomada directamente:

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)   #后置拍摄模式
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # 白平衡关闭
sensor.snapshot(1.8)#去鱼眼化

Luego hay una función para encontrar el bloque de color más grande:

def find_max(blobs): #找最大色块函数。这里是比较像素面积的方式,只返回最大面积色块
    max_size=0
    for blob in blobs:
        if blob[4] > max_size:
            max_blob=blob
            max_size = blob[4]
    return max_blob

Debido a que la función de coordenadas solo marca la posición del píxel, debemos marcar la posición relativa de acuerdo con todo el sitio. Esta es la forma de encontrar la línea negra para encontrar todo el sitio. Debido a que hay demasiadas líneas negras en el sitio, marque el bloque de color negro más grande, necesitamos escribir una función de solo salida del parche de color más grande. Aquí hay que encontrar el bloque de color más grande comparando el número de píxeles que contiene. blob[4] es el número de píxeles.

Para identificar con precisión el color, debe encontrar el umbral de color con precisión. Puede encontrar el umbral de color a través de Herramientas - Visión artificial - Editor de umbral.

 Figura 3 Adquisición de umbral

Importe el archivo de imagen para ajustar el umbral. Cuando solo el color deseado sea blanco, copie el umbral. El umbral reconocido por la cámara puede ser diferente del valor real. Al depurar, debe cambiarse ligeramente dentro de un cierto rango para que el cámara más precisa.

 Figura 3 Editor de umbrales

Los umbrales de los elementos son:

green1_threshold   = (0, 55, -128, -18, 127, -18)
black_threshold  =(0, 46, -128, 15, -2, 44)

Luego use find-blobs para la identificación del color:

    blobs = img.find_blobs([black_threshold])#黑色边框定义识别
    blobs1 = img.find_blobs([green1_threshold])#绿色目标点定义

Después de eso, el borde negro se identifica y luego se calcula para calcular la longitud de píxel de una unidad de longitud.

if blobs:        #寻找黑色边框
        max_blob = find_max(blobs)

        x1=max_blob[0]
        y1=max_blob[1]
        w1=max_blob[2]
        h1=max_blob[3]
        a1=(int((w1/2)+x1)-max_blob[0])/4
        a2=(int((h1/2)+y1)-max_blob[1])/4#计算单位坐标像素长度
        if a1==0:
            a1=1
        if a2==0:
            a2=1        #a1、a2之后要做分母,摄像镜头一开始找目标可能会出现0这里去零
        img.draw_rectangle(max_blob[0:4], color=(0,0,0))#对找到的目标进行黑框标注
        img.draw_cross(int((w1/2)+x1), int((h1/2)+y1))#使用十字标注目标中心点位置
        img.draw_string(max_blob[0],max_blob[1], (str(max_blob[0])+','+str(max_blob[1])), color = (0,0,0))#在显示屏标注目标最左和最下的坐标

La longitud de la unidad de cálculo aquí se calcula de acuerdo con el sitio del proyecto de 8 * 8. Si desea calcular el sitio de otras especificaciones, el código anterior es complicado. Es aproximadamente la longitud del marco negro max-blob dividido por el sitio x número de cuadrículas Aquí está la división Toma ocho.

Luego busque el objetivo verde y calcule las coordenadas del objetivo.

    if (blobs and blobs1):#寻找绿色目标点

        for b in blobs1:
            i=i+1
            x = b[0]
            y = b[1]
            width = b[2]
            height = b[3]




            if (x>=x1 and x<=x1+w1 and y>=y1 and y<=h1):
                c1=int(((b[5]-x1)+10)/a1)
                c2=int(((b[6]-y1)+10)/a2)#计算目标点坐标这里加10是摄像头有误差,我的加10最准确

                img.draw_rectangle([x,y,width,height])#用矩形标记出目标颜色区域
                t1[i-1]=8-abs(c1)
                t2[i-1]=8-abs(c2)#因为显示屏上图像是反转的,所以这里要用8减去。这里要看初始化跟不跟我的一样
                t=[t1[i-1],t2[i-1]]#形成数组,这就是目标点的坐标
                img.draw_cross(b[5], b[6]) #用十字标注目标中心点

Cabe señalar que al calcular las coordenadas, es necesario depurar continuamente y agregar y restar valores de píxeles para evitar grandes errores. Aquí, se agregan valores de 10 píxeles a las coordenadas para mostrar las coordenadas con precisión. Diferentes dispositivos pueden sé diferente.

Este último incluye datos desduplicados y notas de visualización, que son relativamente completos, y el código completo se publica directamente aquí sin explicarlos uno por uno.

Código completo:

import sensor,image,lcd,time
green1_threshold   = (0, 55, -128, -18, 127, -18)
black_threshold  =(0, 46, -128, 15, -2, 44)

#常用初始化
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)   #后置拍摄模式
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # 白平衡关闭
sensor.snapshot(1.8)#去鱼眼化
def find_max(blobs): #找最大色块函数。这里是比较像素面积的方式,只返回最大面积色块
    max_size=0
    for blob in blobs:
        if blob[4] > max_size:
            max_blob=blob
            max_size = blob[4]
    return max_blob
i=0#循环计数
m=0#去除重复计数
t1=[0 for n in range(10000)]
t2=[0 for n in range(10000)]   #将t1和t2进行数组化,便于之后去重复数据
while True:
    img=sensor.snapshot()
    img = sensor.snapshot().lens_corr(strength = 1.2, zoom = 1.0)  #调整显示屏使其更“平整”便于识别,里面参数可更改
    blobs = img.find_blobs([black_threshold])#黑色边框定义识别
    blobs1 = img.find_blobs([green1_threshold])#绿色目标点定义


    if blobs:        #寻找黑色边框
        max_blob = find_max(blobs)

        x1=max_blob[0]
        y1=max_blob[1]
        w1=max_blob[2]
        h1=max_blob[3]
        a1=(int((w1/2)+x1)-max_blob[0])/4
        a2=(int((h1/2)+y1)-max_blob[1])/4#计算单位坐标像素长度
        if a1==0:
            a1=1
        if a2==0:
            a2=1        #a1、a2之后要做分母,摄像镜头一开始找目标可能会出现0这里去零
        img.draw_rectangle(max_blob[0:4], color=(0,0,0))#对找到的目标进行黑框标注
        img.draw_cross(int((w1/2)+x1), int((h1/2)+y1))#使用十字标注目标中心点位置
        img.draw_string(max_blob[0],max_blob[1], (str(max_blob[0])+','+str(max_blob[1])), color = (0,0,0))
        #在显示屏标注目标最左和最下的坐标
        if (max_blob[1]==0):#因为周围环境黑色较多,这里设置当黑色边框顶格时卡顿一下,调整摄像头恢复
            continue

    if (blobs and blobs1):#寻找绿色目标点

        for b in blobs1:
            i=i+1
            x = b[0]
            y = b[1]
            width = b[2]
            height = b[3]




            if (x>=x1 and x<=x1+w1 and y>=y1 and y<=h1):
                c1=int(((b[5]-x1)+10)/a1)
                c2=int(((b[6]-y1)+10)/a2)#计算目标点坐标这里加10是摄像头有误差,我的加10最准确

                img.draw_rectangle([x,y,width,height])#用矩形标记出目标颜色区域
                t1[i-1]=8-abs(c1)
                t2[i-1]=8-abs(c2)#因为显示屏上图像是反转的,所以这里要用8减去。这里要看初始化跟不跟我的一样
                t=[t1[i-1],t2[i-1]]#形成数组,这就是目标点的坐标
                img.draw_cross(b[5], b[6]) #用十字标注目标中心点
            
                n=0
                j=0

                while j<i: #防重复
                    if (t1[i-1]==t1[j-1] and t2[i-1]==t2[j-1]):
                        n=i+1
                    j=j+1
                if (n==0 and (abs(t1[i-1])<9)):#这里是对点进行输出,重复点不输出
                    print(t)
                    m=m+1#计数,记录输出几个点
                img.draw_string(x,y, "x")#标注文本x、y
                img.draw_string(x+10, y, str(t))#标注坐标
                img.draw_string(x,y+20, "green")#标注文本green如果是其他颜色请更改

    lcd.display(img)#lcd屏幕显示

Supongo que te gusta

Origin blog.csdn.net/qq_54034196/article/details/128509164
Recomendado
Clasificación