如何使用 python opencv 计算颜色检测对象

How to count the color detected objects using python opencv

我正在尝试使用颜色检测对象。下面是代码和图片

import cv2
import numpy as np

img = cv2.imread('image2.jpeg')
img1 = img[157:498, 212:705]

hsv = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
lower_bound = np.array([0, 20, 20])
upper_bound = np.array([20, 255, 255])
origMask = cv2.inRange(hsv, lower_bound, upper_bound)
kernel = np.ones((7, 7), np.uint8)
mask = cv2.morphologyEx(origMask, cv2.MORPH_CLOSE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

cv2.imshow("Mask", mask)
cv2.imshow("Crop Image", img1)
cv2.imshow("Orig Image", img)
    
cv2.waitKey(0)
cv2.destroyAllWindows()

所以在上面的代码中,我首先加载了图像。然后将其裁剪到所需区域,然后执行 HSV 以查找橙色对象。 以下为原图

下面是裁剪后的图片

下面是hsv后的mask图

我想知道如何计算蒙版图像中的对象数量。例如,在这种情况下它是 3。在计算它之后,我如何在原始图像上的这些颜色对象上绘制边界框。请帮忙。谢谢

您可以使用二进制蒙版来获取图像的轮廓。然后,您可以计算属于每个轮廓的 边界矩形 。假设输入是您的二进制掩码,脚本应如下所示:

# imports:
import cv2

# image path
path = "D://opencvImages//"
fileName = "objectsMask.png" # This is your binary mask

# Reading an image in default mode:
inputImage = cv2.imread(path + fileName)

# Deep copy for results:
inputImageCopy = inputImage.copy()

# Convert RGB to grayscale:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

# Find the contours on the binary image:
contours, hierarchy = cv2.findContours(grayscaleImage, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Store bounding rectangles and object id here:
objectData = []

# ObjectCounter:
objectCounter = 1

# Look for the outer bounding boxes (no children):
for _, c in enumerate(contours):
    # Get the contour's bounding rectangle:
    boundRect = cv2.boundingRect(c)

    # Store in list:
    objectData.append((objectCounter, boundRect))

    # Get the dimensions of the bounding rect:
    rectX = boundRect[0]
    rectY = boundRect[1]
    rectWidth = boundRect[2]
    rectHeight = boundRect[3]

    # Draw bounding rect:
    color = (0, 0, 255)
    cv2.rectangle(inputImageCopy, (int(rectX), int(rectY)),
                  (int(rectX + rectWidth), int(rectY + rectHeight)), color, 2)

    # Draw object counter:
    font = cv2.FONT_HERSHEY_SIMPLEX
    fontScale = 1
    fontThickness = 2
    color = (0, 255, 0)
    cv2.putText(inputImageCopy, str(objectCounter), (int(rectX), int(rectY)), 
                font, fontScale, color, fontThickness)

    # Increment object counter
    objectCounter += 1

    cv2.imshow("Rectangles", inputImageCopy)
    cv2.waitKey(0)

我正在创建一个名为 objectData 的列表。在这里,我存储了对象的“id”(只是一个对象计数器)及其边界矩形。这是输出: