我正在尝试计算棋盘游戏图像中的形状数量。出于某种原因,计数完全关闭。
我一直在使用网络上的代码(例如,https://www.pyimagesearch.com/2016/02/01/opencv-center-of-contour/)
我只需要 opencv 来解决这个问题,有没有其他人遇到过这个问题,我如何将其限制为我感兴趣的方块?
我用油漆去除了打断每个盒子白线的数字的边缘。我假设这些数字和点是您添加的东西,而不是原始图像的一部分。
这是我修改后的图片
我通过在图像中寻找白色来制作面具。我扩大了结果以获得更清晰的分离和反转,使每个框都是白色的。
我使用 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);
Run Code Online (Sandbox Code Playgroud)