Opencv simplemente se da cuenta del reconocimiento de objetos en una determinada gama de colores

objetivo de aprendizaje:

Use python + opencv para identificar una determinada gama de colores


Listo para trabajar:

1. Entorno de desarrollo de Pycharm
2. Python 3.8.3
3. Gama de componentes de color básicos de opencv4 HSV


Descripción del programa:

El objetivo es detectar objetos cuyo color es amarillo y luego marcar sus centroides y contornos. Los límites superior e inferior de la configuración amarilla provienen del rango de los componentes de color básicos del blog reimpreso de HSV (se elimina la infracción). La
imagen de detección se encuentra a continuación (las imágenes se encuentran en línea, la infracción se elimina):

El programa es relativamente simple, el proceso principal es:
Videocapture obtiene la imagen -> set restablece el tamaño de la imagen para aumentar la velocidad del programa -> convertir cvtColor a formato de imagen hsv -> binarización inRange -> medianBlur filtro mediano - > erosionar la corrosión -> dilatar dilatar -> findContours para encontrar el contorno -> max para encontrar el contorno más grande -> minEnclosingCircle para encontrar el círculo más pequeño que contiene el contorno -> momento para calcular el momento -> calcular el centroide desde el momento -> para marcar el centroide y el círculo


el código se muestra a continuación:

import cv2 as cv
import numpy as np
import matplotlib as plt
import imutils

colorLower = (26, 43, 46)  # 二值化下限
colorUpper = (34, 255, 255)  # 二值化上限

cap = cv.VideoCapture(0)
# cap.set(3, 320)  # 为快速运算,把图片变成缩小成320*240
# cap.set(4, 240)
kerne = np.ones((10, 10), np.uint8)  # 开运算参数

while True:
    ret, frame = cap.read()   # 读取图像
    # cv.namedWindow('frame', cv.WINDOW_AUTOSIZE)
    # cv.imshow('frame', frame)

    hsv = cv.cvtColor(frame.copy(), cv.COLOR_BGR2HSV)  # 转化成hsv格式
    # cv.namedWindow('hsv', cv.WINDOW_AUTOSIZE)
    # cv.imshow('hsv', frame)

    mask = cv.inRange(hsv.copy(), colorLower, colorUpper)  # 根据范围二值化
    # cv.namedWindow('mask', cv.WINDOW_AUTOSIZE)
    # cv.imshow('mask', mask)

    # #  ################## 先开运算再滤波测试  ###################
    # opening = cv.morphologyEx(mask.copy(), cv.MORPH_OPEN, kerne)
    # cv.namedWindow('opening', cv.WINDOW_AUTOSIZE)
    # cv.imshow('opening', opening)
    #
    # median = cv.medianBlur(opening.copy(), 3)
    # cv.namedWindow('median', cv.WINDOW_AUTOSIZE)
    # cv.imshow('median', median)
    # #  ########################################################

    median = cv.medianBlur(mask.copy(), 3)  # 中值滤波 去掉椒盐噪点,参数3表示中值运算方块3*3
    # cv.namedWindow('median', cv.WINDOW_AUTOSIZE)
    # cv.imshow('median', median)

    # #  ########################### 开运算(先腐蚀再运算)  ###########################
    # opening = cv.morphologyEx(median.copy(), cv.MORPH_OPEN, kerne)  # 进行开运算
    # cv.namedWindow('opening', cv.WINDOW_AUTOSIZE)
    # cv.imshow('opening', opening)
    # #  ####################################################################

    #  ########################### 先腐蚀再膨胀  ###########################
    erode = cv.erode(mask.copy(), None, iterations=2)
    dilate = cv.dilate(erode.copy(), None, iterations=2)
    # cv.namedWindow('dilate', cv.WINDOW_AUTOSIZE)
    # cv.imshow('dilate', dilate)
    #  开运算去掉的比较多
    #  #####################################################################

    # 找轮廓
    cnts = cv.findContours(mask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[-2]
    center = None

    # 如果在图中找到一定的轮廓就进行计算,否则不进行计算
    if len(cnts) > 0:

        c = max(cnts, key=cv.contourArea)  # 找到图像中最大的轮廓
        ((x, y), radius) = cv.minEnclosingCircle(c)  # 找到最小的圆包含这个轮廓,返回坐标和半径

        M = cv.moments(c)  # 计算图像的矩
        center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))  # 通过矩计算图像的质心

        # 判断以下他的半径,太小的话就认为是噪声,就忽略掉
        if radius > 10:
            cv.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2)  # 在检测到的轮廓周围画圆圈
            cv.circle(frame, center, 5, (0, 0, 255), -1)

    cv.namedWindow('frame', cv.WINDOW_AUTOSIZE)
    cv.imshow('frame', frame)

    if cv.waitKey(1) == 27:  # 按下Esc键就停止
        break
cap.release()
cv.destroyAllWindows()

Parte de la descripción de la función

(Las siguientes funciones se reimprimen y se elimina la infracción (la escritura es particularmente buena))

  1. Función de corrosión de expansión
  2. Encuentra la función de contorno
  3. Función de cálculo de momento

Descripción del procedimiento

En este programa, se comentan muchas funciones, como la operación abierta, etc. Estas son todas al depurar el programa, para ver qué método es el mejor en el efecto final bajo inspección visual. Si me preguntas por qué hice esto y por qué uso el filtrado de mediana en lugar del filtrado de Gauss, solo puedo decir que este es el resultado de mi ajuste. Mi conocimiento es todavía muy pequeño y no es suficiente para encontrar directamente un algoritmo mejor a través de los cálculos. En la actualidad, todavía estoy atascado en la depuración constante, el cambio de parámetros y la verificación de información en línea para encontrar un proceso de reconocimiento relativamente bueno.

Resultado del reconocimiento:

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_50303783/article/details/109232486
Recomendado
Clasificación