You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过OpenCV findContours优化灰缝铺地石块的检测效果?

如何通过OpenCV findContours优化灰缝铺地石块的检测效果?

我现在需要尽可能准确地勾勒出街道区域里所有带灰缝的石块轮廓。目前用下面这段代码能检测到部分石块,但很多石块要么完全没被检测出来,要么只有部分轮廓;还有像轮廓56、57、92这类的结果明显不对——我清楚这些石块是排列整齐、大多呈椭圆形的。我已经知道怎么剔除明显的异常轮廓,但现在首先得改进检测方法本身,而不是靠事后处理来补漏。

下面是我目前使用的检测代码:

import cv2
img = cv2.imread('in.jpg')
gray = cv2.bitwise_not(img)
gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (113, 113), 0)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 61, 2)
thresh = cv2.dilate(thresh, None, iterations=5)
thresh = cv2.erode(thresh, None, iterations=1)
cnts, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f'Found {len(cnts)} contours')
cv2.drawContours(img, cnts, -1, (0, 255, 0), 2)
centroids = [cv2.moments(c) for c in cnts]
for i, c in enumerate(centroids):
  cv2.putText(img, str(i), (int(c['m10'] / c['m00']), int(c['m01'] / c['m00']) - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
cv2.imwrite('out.jpg', img)

代码里的这些参数(比如高斯模糊用的113×113核尺寸、自适应阈值的61块大小等)都是我反复试错调出来的,但效果还是不理想。而且我的需求不只是统计石块数量,更要尽可能精准地还原每块石块的实际形状。

补充(由Markus提供):这里还有一张混合区域的示例,区域里既有带灰缝的石块,也有没有灰缝的部分。
混合区域石块示例:部分带灰缝,部分无灰缝

备注:内容来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:24:33