如何使用 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”(只是一个对象计数器)及其边界矩形。这是输出:
我正在尝试使用颜色检测对象。下面是代码和图片
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”(只是一个对象计数器)及其边界矩形。这是输出: