首页 > 解决方案 > 计算图像中形状的数量

问题描述

我正在尝试计算棋盘游戏图像中的形状数量。由于某种原因,计数完全关闭。

我一直在使用来自网络的代码(例如,https://www.pyimagesearch.com/2016/02/01/opencv-center-of-contour/

我只需要opencv,有没有其他人遇到过这个问题,我如何将它限制在我感兴趣的方块上?

这是与下图相同的图像,但背景现在是黑色的。现在,图像边缘周围的中心点比需要的多。

我希望中心点出现在板上的每个方格中

标签: pythonopencv

解决方案


我用油漆去除了打断每个盒子白线的数字边缘。我假设这些数字和点是您添加的东西,而不是原始图像的一部分。

这是我修改后的图像

在此处输入图像描述

我通过在图像中寻找白色来制作面具。我扩大了结果以获得更清晰的分离和反转,以便每个框都是白色的。

在此处输入图像描述

我使用 findContours 来获取蒙版中每个白色对象的轮廓。我按大小过滤轮廓以去除箭头、字母位和图像背景。从那里我绘制了每个剩余轮廓的质心。

在此处输入图像描述

import cv2
import numpy as np

# load image
img = cv2.imread("chutes_n_ladders.png");

# mask
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
mask = cv2.inRange(gray, 240, 255);

# dilate and invert
kernel = np.ones((3,3), np.uint8);
mask = cv2.dilate(mask, kernel, iterations = 1);
mask = cv2.bitwise_not(mask);

# contours
_, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE);

# remove very large and very small contours
filtered = [];
low = 1000;
high = 100000;
for con in contours:
    area = cv2.contourArea(con);
    if low < area and area < high:
        filtered.append(con);

# draw centers of each
print("Shapes: " + str(len(filtered)));
for con in filtered:
    M = cv2.moments(con);
    cx = int(M['m10']/M['m00']);
    cy = int(M['m01']/M['m00']);
    cv2.circle(img, (cx, cy), 10, (0, 200, 100), -1);

# show
cv2.imshow("Image", img);
cv2.imshow("Mask", mask);
cv2.waitKey(0);

推荐阅读