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

基于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()

代码说明

  1. 边界厚度调整:cv2.drawContours中的thickness参数可以根据你的实际需求修改,数值越大,检测的边界区域越宽。
  2. 红色范围优化:HSV中的红色分为两段(0-13和160-180左右),补充第二段检测可以避免遗漏偏深红的像素。
  3. 结果判断:通过cv2.countNonZero统计边界区域内的红色像素数量,大于0则说明禁止区域存在红色。

内容的提问来源于stack exchange,提问作者Fernando Rivera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:55:49