先说背景:在一个控制室里面有很多空气断路器,在不通过外接其它设备去监听这个开关的状态,可以通过高清摄像头去做图像识别,用于实时监听所有开关的状态。
这里面会有一个上位机去查看每个摄像头画面,然后通过拖拽框选空气断路器,且标注名称。这里我们跳过。直接看看如何快速识别开关的状态。
先看看空气断路器图像:
我们在实际场景中识别图像,最好按图像的现有特征来找。比如:这个空气断路器,这个开关是红色的。向上打,就是开的状态。
思路就是通过 红色,快速找出这个轮廓。然后我们知道这个是开状态。那么可以使用它做为模板。去对比后面的图像,当关开状态的轮廓而得出结果。
直接上代码。
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()
以上是识别开关的全部代码。可以直接运行。 有了这个开关识别算法,那么这个小的上位机软件就基本没有难度了。
fpga锁相板卡定制开发解决方案
一、 核心概念:什么是FPGA锁相板卡? 锁相技术(Lock-in Amplification)的核心是从强噪 […]
Keras深度学习:从“Hello World”到“我模型跑起来了!”的奇幻(秃头)之旅
朋友们,听说你想玩深度学习?不想从底层CUDA开始撸矩阵乘法,也不想被PyTorch的动态图绕晕?恭喜你,Ke […]
用 PyTorch 实现一个简单的神经网络:从数据到预测
PyTorch 是目前最流行的深度学习框架之一,以其灵活性和易用性受到开发者的喜爱。本文将带你从零开始,用 P […]
脉冲控制程序开发
一、脉冲控制程序的典型应用场景 应用类型 控制对象 脉冲作用 步进电机控制 电机转动/定位 每个脉冲对应一个步 […]
电机控制MATLAB仿真软件开发
一、 核心仿真模块构建 1. 电机本体建模 matlab % PMSM dq轴数学模型示例 (状态空 […]
使用Vue和Web Worker实现TCP消息监听并实时更新图表
在现代Web应用中,实时数据可视化是一个常见的需求。本文将介绍如何在Vue应用中结合Web Worker来监听 […]
仪器设备远端控制系统开发
核心实现色谱设备云端协同操控与数据全生命周期管理。系统采用分层架构设计:
机械臂路线规划系统开发
项目介绍: 该项目主要通过机械臂末端搭载双目相机扫描环境,实时构建障碍物点云地图通过红外结构光扫描面部生成密集 […]
无线路由器上位机开发
项目介绍 为满足智能工厂中对生产数据实时远程监测的需求,由你创为客户开发了一套无线路由器上位机软件。该项目采用 […]
血液检测管理系统软件定制开发
项目介绍 该项目是为 某医院开发的血液检测管理系统:以样本唯一码为线索,贯通接收、分拣、前处理、上机、审核、报 […]
分析仪控制采集分析软件开发
项目介绍 该项目是跨厂商、跨接口的通用仪器控制与数据平台,集连接管理、实时/触发/定时/条件采集、元数据绑定、 […]
开源鸿蒙适配器KHP-系列硬件设备产测功能开发
案例背景 开源鸿蒙适配器KHP-系列的硬件设备的产测功能开发。实现了KHP-IC500设备在出厂前测试硬件功能 […]
联系电话:
电子邮箱:unczzb@unicrom.cn
深圳研发中心(总部): 深圳市龙华区港深国际中心十楼E区
太原研发中心: 山西省太原市万迎泽西大街120号时代天峰1918室
上海办事处: 上海市浦东新区牡丹路60号,东辰大厦7楼702室
扫一扫,关注由你创科技