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

如何使用OpenCV查找图像中黄色框的坐标中心

使用OpenCV查找黄色框的中心坐标

1. 依赖安装

先确保你安装了必要的库:

pip install opencv-python numpy

2. 完整实现代码

以下是可直接运行的代码,我会逐段解释关键逻辑:

import cv2
import numpy as np

# 加载目标图像(替换成你的图像路径)
img = cv2.imread('yellow_box.jpg')
# 转换为HSV颜色空间——比RGB更适合颜色分割,抗光照干扰
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 定义黄色的HSV阈值范围(可根据你的图像微调)
lower_yellow = np.array([20, 100, 100])
upper_yellow = np.array([30, 255, 255])

# 生成黄色区域的掩码(掩码中黄色区域为白色,其余为黑色)
mask = cv2.inRange(hsv, lower_yellow, upper_yellow)

# 形态学操作:去除小噪点,填补区域空洞
kernel = np.ones((5,5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)  # 先腐蚀后膨胀,清噪点
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 先膨胀后腐蚀,补空洞

# 查找图像中的轮廓
contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 处理每个黄色区域,计算中心
for cnt in contours:
    # 过滤过小的轮廓,避免噪点干扰
    if cv2.contourArea(cnt) < 100:
        continue
    # 计算轮廓的图像矩
    M = cv2.moments(cnt)
    # 通过矩计算中心坐标
    cx = int(M['m10'] / M['m00'])
    cy = int(M['m01'] / M['m00'])
    # 在原图上标记中心(红色圆点)
    cv2.circle(img, (cx, cy), 5, (0, 0, 255), -1)
    print(f"黄色区域中心坐标:({cx}, {cy})")

# 显示结果窗口
cv2.imshow('Yellow Centers', img)
cv2.imshow('Yellow Mask', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 关键逻辑解释

为什么用HSV颜色空间?

RGB颜色空间的三个通道相互关联,受光照变化影响大。HSV的**H(色调)**通道直接对应颜色本身,调整阈值时更精准,能有效过滤光照干扰。如果你的黄色偏暗/偏亮,直接微调lower_yellow和upper_yellow的数值即可。

形态学操作的作用

  • MORPH_OPEN:先腐蚀再膨胀,能清除掩码中小的白色噪点(比如图像中的黄色小斑点)。
  • MORPH_CLOSE:先膨胀再腐蚀,填补黄色区域内部的黑色空洞,让轮廓更完整。

两种计算中心的方式

方式1:按轮廓计算(适合多个独立黄色区域)

通过cv2.moments计算轮廓的矩,进而得到每个黄色区域的中心,适合图像中有多个黄色框的场景,能分别获取每个框的中心。

方式2:按所有黄色像素计算(适合整体黄色区域)

如果你想计算所有黄色区域的平均中心,可以用numpy直接获取所有黄色像素的坐标:

# 获取掩码中所有白色像素的坐标(注意返回格式是(y, x))
yellow_pixels = np.where(mask == 255)
if len(yellow_pixels[0]) > 0:
    # 计算x和y的平均值
    avg_cx = int(np.mean(yellow_pixels[1]))
    avg_cy = int(np.mean(yellow_pixels[0]))
    print(f"所有黄色区域的平均中心:({avg_cx}, {avg_cy})")
    # 在图上标记
    cv2.circle(img, (avg_cx, avg_cy), 7, (255, 0, 0), -1)

你之前用numpy失败,大概率是没注意np.where返回的坐标顺序是**(y轴索引, x轴索引)**,搞反了x和y的取值。

4. 常见问题调整

  • 黄色区域检测不全:打开掩码窗口Yellow Mask,如果目标黄色区域没完全变白,就微调HSV的上下限。可以用取色工具提取目标黄色的HSV值作为参考。
  • 噪点太多:增大形态学操作的kernel尺寸(比如改成(7,7)),或者提高轮廓面积的过滤阈值(把100改成更大的数)。
  • 轮廓嵌套:cv2.RETR_EXTERNAL参数只提取最外层轮廓,避免内部嵌套轮廓干扰计算。

内容的提问来源于stack exchange,提问作者Harish B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:30:50