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

岩石检测技术求助:无法识别全部岩石,黑色岩石检测失败

岩石检测问题解决方案

我来帮你解决这个岩石检测的问题~你现在遇到的核心问题是当前的HSV颜色阈值完全没覆盖黑色岩石的特征,咱们一步步来调整:

为什么黑色岩石检测不到?

你当前设置的HSV阈值里,V_Min=139——而黑色岩石的明度(V通道)值非常低,通常在0-50左右,直接被这个高阈值过滤掉了,自然检测不到。同时你的H、S范围也只针对某一类颜色的岩石,所以只能识别部分岩石。

具体修改方案

1. 补充黑色岩石的HSV阈值范围

黑色的HSV特征是:色相(H)任意,饱和度(S)可高可低(纯黑S接近0,带杂色的黑S可能偏高),明度(V)极低。我们可以新增一个针对黑色的mask,然后和原有的岩石mask合并。

2. 优化代码,加入滑动条方便调试

你代码里已经有nothing(x)函数,刚好可以用来创建HSV滑动条,实时调整参数找到最适合的阈值,不用每次改代码重新运行。

修改后的完整代码如下:

import numpy as np
import cv2

def nothing(x):
    pass

# 创建窗口和滑动条,方便实时调整HSV参数
cv2.namedWindow("HSV Adjustments")
cv2.createTrackbar("H_Min", "HSV Adjustments", 147, 179, nothing)
cv2.createTrackbar("H_Max", "HSV Adjustments", 169, 179, nothing)
cv2.createTrackbar("S_Min", "HSV Adjustments", 19, 255, nothing)
cv2.createTrackbar("S_Max", "HSV Adjustments", 103, 255, nothing)
cv2.createTrackbar("V_Min", "HSV Adjustments", 139, 255, nothing)
cv2.createTrackbar("V_Max", "HSV Adjustments", 199, 255, nothing)
# 新增黑色岩石的V阈值滑动条
cv2.createTrackbar("Black_V_Max", "HSV Adjustments", 50, 255, nothing)

while True:
    name_pic='153.jpg'
    img = cv2.imread(name_pic)
    frame = cv2.imread(name_pic)
    if img is None:
        print("无法读取图片,请检查路径是否正确")
        break
    img = cv2.resize(img, (1500, 1000))
    frame = cv2.resize(frame, (1500, 1000))
    blurred = cv2.GaussianBlur(frame, (5, 5), 0)
    hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)
    
    # 获取滑动条当前值
    H_Min = cv2.getTrackbarPos("H_Min", "HSV Adjustments")
    H_Max = cv2.getTrackbarPos("H_Max", "HSV Adjustments")
    S_Min = cv2.getTrackbarPos("S_Min", "HSV Adjustments")
    S_Max = cv2.getTrackbarPos("S_Max", "HSV Adjustments")
    V_Min = cv2.getTrackbarPos("V_Min", "HSV Adjustments")
    V_Max = cv2.getTrackbarPos("V_Max", "HSV Adjustments")
    Black_V_Max = cv2.getTrackbarPos("Black_V_Max", "HSV Adjustments")
    
    # 原岩石的mask
    mask_rock = cv2.inRange(hsv, (H_Min, S_Min, V_Min), (H_Max, S_Max, V_Max))
    # 黑色岩石的mask:H任意,S任意,V从0到设置的最大值
    mask_black = cv2.inRange(hsv, (0, 0, 0), (179, 255, Black_V_Max))
    
    # 合并两个mask,得到完整的岩石检测结果
    mask_total = cv2.bitwise_or(mask_rock, mask_black)
    
    # 对mask做一些形态学操作,去除噪点
    kernel = np.ones((5,5),np.uint8)
    mask_total = cv2.morphologyEx(mask_total, cv2.MORPH_OPEN, kernel)
    mask_total = cv2.morphologyEx(mask_total, cv2.MORPH_CLOSE, kernel)
    
    # 将mask应用到原图,显示检测结果
    result = cv2.bitwise_and(img, img, mask=mask_total)
    
    cv2.imshow("Original", img)
    cv2.imshow("Detection Result", result)
    cv2.imshow("Mask", mask_total)
    
    # 按ESC退出循环
    if cv2.waitKey(1) & 0xFF == 27:
        break

cv2.destroyAllWindows()

使用说明

  1. 运行代码后,会弹出HSV Adjustments滑动条窗口,你可以拖动各个滑块:
    • 调整原岩石的H/S/V阈值,确保原来能检测的岩石依然被识别
    • 拖动Black_V_Max滑块,找到能刚好覆盖所有黑色岩石的最大值(一般50左右就够,根据你的图片调整)
  2. 形态学操作(开运算+闭运算)可以帮你去除检测结果里的小噪点,让岩石轮廓更清晰
  3. 如果你的岩石还有其他颜色,也可以用同样的方法新增对应的mask,然后合并

内容的提问来源于stack exchange,提问作者Chinnawat Chinnapun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:09