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

如何使用Python+OpenCV获取圆形区域内的平均RGB值

OpenCV提取检测圆形区域内RGB均值实现方法

核心实现逻辑是通过掩码隔离圆形区域,再对区域内像素做统计计算,步骤如下:

  • 检测到目标圆后,生成与帧尺寸一致的全黑单通道掩码
  • 在掩码上将目标圆内部填充为白色,仅保留圆形区域为有效计算区
  • 调用OpenCV自带的均值计算接口,传入掩码直接得到区域内各通道均值,避免掩码外黑色0值干扰计算结果
  • OpenCV默认读取的帧为BGR通道顺序,将得到的通道值倒序排列即可得到标准RGB均值

注意:原代码存在变量拼写错误prevCirlce,会导致上一帧圆形位置缓存失效,以下代码已修正该问题。

修改后的可运行代码:

import cv2 as cv
import numpy as np

prevCircle = None
dist = lambda x1,y1,x2,y2 : (x1-x2)**2+(y1-y2)**2
videoCapture = cv.VideoCapture(0) # 替换为你的视频流地址

while True:
    (grabbed, frame) = videoCapture.read()
    if not grabbed:
        break
    grayFrame = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
    blurFrame = cv.GaussianBlur(grayFrame,(11,11),0)
    height, width, _ = frame.shape
    circles = cv.HoughCircles(blurFrame ,cv.HOUGH_GRADIENT,1.2,50,param1=100,param2=30,minRadius=75,maxRadius=400)
    if circles is not None:
        circles = np.uint16(np.around(circles))
        chosen=None
        for i in circles[0 ,:]:
            if chosen is None: 
                chosen =i
            if prevCircle is not None:
                if dist(chosen[0],chosen[1],prevCircle[0],prevCircle[1]) <= dist(i[0],i[1],prevCircle[0],prevCircle[1]):
                    chosen = i
        # 绘制检测结果
        cv.circle(frame,(chosen[0],chosen[1]),1,(0,100,100),3)
        cv.circle(frame,(chosen[0],chosen[1]),chosen[2],(0,0,0),3)
        
        # ========== 计算圆形区域RGB均值 ==========
        # 生成圆形掩码
        mask = np.zeros((height, width), dtype=np.uint8)
        cv.circle(mask, (chosen[0], chosen[1]), chosen[2], 255, -1) # -1表示填充圆形内部
        # 计算掩码区域内的BGR均值,自动忽略掩码为0的区域
        mean_bgr = cv.mean(frame, mask=mask)[:3]
        # 转换为RGB顺序
        mean_rgb = (round(mean_bgr[2],2), round(mean_bgr[1],2), round(mean_bgr[0],2))
        # 可在帧上打印均值查看结果
        cv.putText(frame, f"Mean RGB: {mean_rgb}", (10,30), cv.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,0),2)
        # ==============================================
        
        prevCircle = chosen
    cv.imshow("Camera", frame)
    # 按q键退出循环
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

videoCapture.release()
cv.destroyAllWindows()

检测效果参考:
检测效果示意图

内容的提问来源于stack exchange,提问作者Yahia Cherif Menaouer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:45:40