python - 计算图像中形状的数量
问题描述
我正在尝试计算棋盘游戏图像中的形状数量。由于某种原因,计数完全关闭。
我一直在使用来自网络的代码(例如,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);
推荐阅读
- c# - 在实体框架中 EntityState.Detached 使操作变慢
- swift - 如何在登录页面上制作 firebase 验证凭据
- flutter - 扑。如何在 Sliver 中使用 SliverPersistentHeaderDelegate 管理状态?
- google-forms - 在谷歌表单确认页面上清除提交
- python - 谷歌的地理编码 API 关闭连接没有响应
- node.js - AWS Lambda 上的 Apollo Gateway 无法读取未定义的属性“内容类型”
- bash - Erlang 和 bash 脚本(escript)
- c# - 在 C# 中使用具有多个偏移量的指针
- python - 如何在另一个数据框中找出 Timeindex 的变化?
- vlang - V 的路径中可以有空格吗?