深圳市由你创科技有限公司 -- 软件行业的源头工厂

选择语言
  • 实验室自动化
  • FPGA 开发
  • 嵌入式板卡定制
  • 上位机
  • SCADA定制开发
  • 工业软件开发
  • 物联网开发
  • IT信息系统开发
  • 安卓系统开发
  • Windows系统开发
  • 鸿蒙系统开发
  • 创新研发
  • 工业互联网
  • 智慧医疗
  • 智慧城市
  • 智慧农业
  • 系统集成

24小时咨询热线:

18138869082

软件开发_上位机开发_物联网开发_APP开发_深圳软件定制开发公司 软件开发_上位机开发_物联网开发_APP开发_深圳软件定制开发公司
首页 / 新闻 / Python识别空气断路器开状态

Python识别空气断路器开状态

作者:由你创 发布时间: 2024-10-21 阅读量:73

先说背景:在一个控制室里面有很多空气断路器,在不通过外接其它设备去监听这个开关的状态,可以通过高清摄像头去做图像识别,用于实时监听所有开关的状态。

这里面会有一个上位机去查看每个摄像头画面,然后通过拖拽框选空气断路器,且标注名称。这里我们跳过。直接看看如何快速识别开关的状态。

先看看空气断路器图像:

我们在实际场景中识别图像,最好按图像的现有特征来找。比如:这个空气断路器,这个开关是红色的。向上打,就是开的状态。

思路就是通过 红色,快速找出这个轮廓。然后我们知道这个是开状态。那么可以使用它做为模板。去对比后面的图像,当关开状态的轮廓而得出结果。

直接上代码。

import cv2
import numpy as np

# 读取图像
image = cv2.imread('on.png')  # 替换为你的图像路径

# 将图像转换为HSV色彩空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 定义红色的HSV范围
lower_red1 = np.array([0, 100, 100])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([160, 100, 100])
upper_red2 = np.array([180, 255, 255])

# 创建一个掩码,找出红色区域
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = cv2.bitwise_or(mask1, mask2)

# 查找红色的轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 如果找到了红色的轮廓
if contours:
    # 找到最大的轮廓
    largest_contour = max(contours, key=cv2.contourArea)
    # 创建一个全黑的掩码
    largest_mask = np.zeros_like(mask)
    # 在新的掩码上绘制最大的轮廓
    cv2.drawContours(largest_mask, [largest_contour], -1, 255, thickness=cv2.FILLED)
    # 使用新的掩码与原始图像进行结合
    result = cv2.bitwise_and(image, image, mask=largest_mask)
    # 可选:显示结果
    cv2.imshow('Largest Red Area', result)
else:
    print("没有检测到红色开关")

# 可选:显示图像和掩码
cv2.imshow('Original Image', image)
# cv2.imshow('Mask', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

可以看到。精准提取到这个开关的轮廓。这里上一个关状态的图,

可以看看:

有这开状态的轮廓,和关状态的轮廓。那么后面就简单多了。
先加载 开状态 和关状态 的轮廓。 做为源头。然后不停的从相机获取图像,然后提取红色最大轮廓,用来比对。
开和关都比对。 哪个更接近,就是哪个状态。(注意这里没有只比对开状态,然后不是开状态就是关。这里开关都比对,会更精准),上代码 。

import cv2
import numpy as np

openContour = None
closeContour = None

# 定义红色的HSV范围
lower_red1 = np.array([0, 100, 100])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([160, 100, 100])
upper_red2 = np.array([180, 255, 255])


def init_open_contour():
    global openContour, lower_red1, upper_red1, lower_red2, upper_red2
    # 加载之前保存的轮廓图像
    open_contour = cv2.imread('on.png')
    # 将图像转换为HSV色彩空间
    open_hsv = cv2.cvtColor(open_contour, cv2.COLOR_BGR2HSV)
    open_mask1 = cv2.inRange(open_hsv, lower_red1, upper_red1)
    open_mask2 = cv2.inRange(open_hsv, lower_red2, upper_red2)
    open_mask = cv2.bitwise_or(open_mask1, open_mask2)
    cts, _ = cv2.findContours(open_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if cts:
        # 找到最大的轮廓
        openContour = max(cts, key=cv2.contourArea)


def init_close_contour():
    global closeContour, lower_red1, upper_red1, lower_red2, upper_red2
    # 加载之前保存的轮廓图像
    contour = cv2.imread('off.png')
    # 将图像转换为HSV色彩空间
    open_hsv = cv2.cvtColor(contour, cv2.COLOR_BGR2HSV)
    open_mask1 = cv2.inRange(open_hsv, lower_red1, upper_red1)
    open_mask2 = cv2.inRange(open_hsv, lower_red2, upper_red2)
    open_mask = cv2.bitwise_or(open_mask1, open_mask2)
    cts, _ = cv2.findContours(open_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if cts:
        # 找到最大的轮廓
        closeContour = max(cts, key=cv2.contourArea)


def run():
    global openContour, closeContour, lower_red1, upper_red1, lower_red2, upper_red2
    # 这里加载要识别的图像
    new_largest_contour = cv2.imread('on.png')
    hsv = cv2.cvtColor(new_largest_contour, cv2.COLOR_BGR2HSV)
    # 创建一个掩码,找出红色区域
    mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
    mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
    mask = cv2.bitwise_or(mask1, mask2)
    # 查找红色的轮廓
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 如果找到了红色的轮廓
    if contours:
        # 找到最大的轮廓
        largest_contour = max(contours, key=cv2.contourArea)
        # 对比轮廓
        # 使用cv2.matchShapes比较两个轮廓的相似度
        similarity_score = cv2.matchShapes(openContour, largest_contour, cv2.CONTOURS_MATCH_I1, 0.0)
        similarity_score2 = cv2.matchShapes(closeContour, largest_contour, cv2.CONTOURS_MATCH_I1, 0.0)
        # 输出相似度
        print(f"轮廓相似度: 开状态:{similarity_score}    关状态:{similarity_score2}")
        # 根据相似度判断开关状态
        if similarity_score < similarity_score2:
            print("开关状态: 开")
        else:
            print("开关状态: 关")
    else:
        print("没有检测到新的红色区域")


if __name__ == '__main__':
    init_open_contour()
    init_close_contour()
    run()

  以上是识别开关的全部代码。可以直接运行。 有了这个开关识别算法,那么这个小的上位机软件就基本没有难度了。

总访问量:6930614    今日访问量:20730    您是今天第:20731 位访问者