如何使用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
相关产品推荐
相关产品推荐

