基于OpenCV Python在树莓派上检测热图轮廓区域是否含红色
检测热图边界禁止区域的红色像素
针对你的需求,我们可以分两步实现:先提取热图的边界/轮廓区域,再在这个限定区域内检测红色像素。下面是具体的实现思路和代码优化:
步骤1:提取热图的边界区域
首先我们需要从原图中分离出热图的轮廓边界(也就是你说的禁止区域)。观察你的热图,它是一个圆形区域,周围是白色背景,所以可以通过轮廓检测来定位:
- 将图像转为灰度图,然后二值化(区分热图和白色背景)
- 查找图像中的轮廓,筛选出最大的那个(就是热图的圆形轮廓)
- 创建一个空白掩码,只绘制热图的边界部分(设置合适的厚度,比如5像素,代表禁止区域的宽度)
步骤2:在边界区域内检测红色
把你原来的红色检测掩码,和上面得到的边界掩码做位与运算,这样就能只保留边界区域内的红色像素。最后统计结果中的非零像素数量,判断是否存在红色。
完整代码示例
import cv2 import numpy as np # 读取图像 frame = cv2.imread('heatmap.png') # 备份原图用于显示 original = frame.copy() # -------------------------- 步骤1:提取热图边界区域 -------------------------- # 转为灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 二值化:反色处理,因为热图区域比背景暗 _, binary = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV) # 查找轮廓 contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找到最大的轮廓(热图的圆形区域) heatmap_contour = max(contours, key=cv2.contourArea) # 创建空白掩码,用于绘制边界区域 boundary_mask = np.zeros_like(gray) # 绘制热图的边界,厚度设为5(可根据实际需求调整,代表禁止区域的宽度) cv2.drawContours(boundary_mask, [heatmap_contour], -1, 255, thickness=5) # -------------------------- 步骤2:在边界区域检测红色 -------------------------- # 转为HSV空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 红色的HSV范围(红色在HSV中是两段,补充第二段避免遗漏深红像素) lower_red1 = np.array([0, 100, 100]) upper_red1 = np.array([13, 255, 255]) lower_red2 = np.array([160, 100, 100]) upper_red2 = np.array([180, 255, 255]) # 生成完整的红色掩码 mask_red1 = cv2.inRange(hsv, lower_red1, upper_red1) mask_red2 = cv2.inRange(hsv, lower_red2, upper_red2) mask_red = cv2.bitwise_or(mask_red1, mask_red2) # 只保留边界区域内的红色 boundary_red_mask = cv2.bitwise_and(mask_red, boundary_mask) # 判断是否存在红色:统计非零像素数量 red_pixel_count = cv2.countNonZero(boundary_red_mask) if red_pixel_count > 0: print("警告:禁止区域(热图边界)存在红色高温区域!") else: print("安全:禁止区域无红色高温区域。") # -------------------------- 可视化结果 -------------------------- # 在原图上绘制边界区域 cv2.drawContours(original, [heatmap_contour], -1, (0,255,0), thickness=5) # 显示各个窗口 cv2.imshow('Original with Boundary', original) cv2.imshow('Boundary Mask', boundary_mask) cv2.imshow('Red in Boundary', boundary_red_mask) cv2.waitKey(0) cv2.destroyAllWindows()
代码说明
- 边界厚度调整:
cv2.drawContours中的thickness参数可以根据你的实际需求修改,数值越大,检测的边界区域越宽。 - 红色范围优化:HSV中的红色分为两段(0-13和160-180左右),补充第二段检测可以避免遗漏偏深红的像素。
- 结果判断:通过
cv2.countNonZero统计边界区域内的红色像素数量,大于0则说明禁止区域存在红色。
内容的提问来源于stack exchange,提问作者Fernando Rivera
相关产品推荐
相关产品推荐

