通过图像识别技术监控屏幕画面卡死问题
创作时间:
作者:
@小白创作中心
通过图像识别技术监控屏幕画面卡死问题
引用
1
来源
1.
https://www.cnblogs.com/skyflask/p/8280922.html
本文介绍了一种通过图像识别技术(OpenCV)来监控屏幕画面卡死问题的解决方案。文章详细描述了问题的背景、需求分析、解决方案以及具体实现步骤,具有较高的技术价值和实用性。
一、背景需求
某公司视频组在录制游戏PVP视频时,遇到了录制程序卡死的问题:虽然录制程序仍在运行,但后台渲染引擎出现异常,导致游戏画面停滞。为了解决这一问题,需要开发一种监控机制,能够在画面卡死时及时发出警报。
二、需求分析
针对这一需求,可以从以下几个层面进行分析:
- 数据层面:分析在渲染引擎工作异常时,数据包或网络流量是否会出现突变。
- 系统层面:监控录制程序的资源占用情况(CPU/内存/IO),查看画面卡住时是否有异常。
- 代码层面:检查录制程序的日志输出,看是否能发现错误信息。
经过分析发现:
- 数据层面:渲染引擎工作异常时,数据包大小没有变化。
- 系统层面:录制程序的资源占用情况在引擎异常时基本不变。
- 代码层面:虽然有错误日志产生,但重启渲染引擎并不能完全解决问题,有时仍需要重启整个录制程序。
因此,需要开发一种能够自动检测画面卡死情况的监控机制。
三、解决方案
最初尝试了一些简单的方法,如使用按键精灵截取屏幕并比较图片大小,或者通过MD5值比较截图文件,但这些方法都无法有效解决问题。最终,决定采用机器学习和图像识别技术来实现监控。
四、OpenCV实现
OpenCV简介
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,提供了丰富的图像处理和计算机视觉算法,广泛应用于商业产品中。
图片识别原理
OpenCV通过识别图像的特征并计算相似度来判断两张图片是否相同。具体实现步骤如下:
- 抓取当前屏幕并保存为图片文件。
- 获取当前目录下所有PNG文件。
- 获取最新的两张图片。
- 计算两张图片的相似度并写入文件。
以下是具体的Python代码实现:
#!/usr/bin/env python
# coding:utf-8
from PIL import ImageGrab
import time
import os
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 抓取当前屏幕
cur_dir = os.path.dirname(__file__)
im = ImageGrab.grab()
im.save(os.path.join(cur_dir,"%s.png" %time.time()))
# 获取当前目录下所有png文件
def all_path(dirname):
result = []
for maindir, subdir, file_name_list in os.walk(dirname):
for filename in file_name_list:
if filename.endswith('.png'):
apath = os.path.join(maindir, filename)
result.append(apath)
return result
# 获取最新的两个文件
def get_max_two(file_list):
rt = []
for f in file_list:
rt.append((f,os.path.getctime(f)))
rt = sorted(rt,key=lambda x:x[1],reverse=True)
return rt[0][0],rt[1][0]
# 计算单通道的直方图的相似值
def calculate(image1, image2):
hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])
hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])
# 计算直方图的重合度
degree = 0
for i in range(len(hist1)):
if hist1[i] != hist2[i]:
degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))
else:
degree = degree + 1
degree = degree / len(hist1)
return degree
# 通过得到每个通道的直方图来计算相似度
def classify_hist_with_split(image1, image2, size=(256, 256)):
# 将图像resize后,分离为三个通道,再计算每个通道的相似值
image1 = cv2.resize(image1, size)
image2 = cv2.resize(image2, size)
sub_image1 = cv2.split(image1)
sub_image2 = cv2.split(image2)
sub_data = 0
for im1, im2 in zip(sub_image1, sub_image2):
sub_data += calculate(im1, im2)
sub_data = sub_data / 3
return sub_data
if __name__ == '__main__':
# 获取2张图片的相似度
cur_dir = os.path.dirname(__file__)
file_list = all_path(cur_dir)
img1, img2 = get_max_two(file_list)
img1 = cv2.imread(img1)
img2 = cv2.imread(img2)
degree = classify_hist_with_split(img1, img2)
if isinstance(degree, int):
with open(os.path.join(cur_dir, "a.txt"), 'w+') as f:
f.write(str(degree))
else:
with open(os.path.join(cur_dir,"a.txt"),'w+') as f:
f.write(str(degree[0]))
实现步骤
- 设置计划任务:将上述脚本添加到系统的计划任务中定期运行。
- 通过Zabbix进行监控:
- 自定义监控项:
UserParameter=get_degree,type d:\pych\a.txt
- 获取监控值:
[root@localhost ~]# zabbix_get -s 10.20.122.18 -kget_degree
- 设置触发器:当相似度达到99%以上时触发警报。
通过这种方式,可以有效地监控屏幕画面卡死的问题,并及时发出警报。
热门推荐
单人也能玩的海龟汤!《海龟蘑菇汤》Steam免费上线
从日本网络作品走红全球,海龟汤游戏成聚会新宠
解谜游戏双雄:海龟汤靠逻辑,传统靠观察
别被忽悠了!关于零重力座椅商家不想告诉你的事,安全隐患严重
零重力座椅:汽车座椅技术的革新
湛江至西藏自驾游全纪录:穿越千山万水探秘高原圣境
丹东到海南旅游全攻略:路线推荐与景点指南
从经期到更年期:妈妈一生的健康饮食方案
保持低调,设定界限:专家解析办公室恋情处理之道
家和万事兴:三个细节决定家庭幸福
清明上河园:从名画到名园的千年传奇
河南最美自然景观旅游指南:打卡云台山、老君山、白云山和尧山
留学美国与新西兰哪个更适合你?
新西兰奥克兰大学艺术专业留学全方位指南
奥克兰大学研究生专业详解:申请条件、费用及优势
门冬氨酸鸟氨酸注射液具体有哪些功效
门冬氨酸鸟氨酸注射液正确使用的说明
职场话题|侮辱性不强,伤害性不小,如何警惕职场“微歧视”
保定到乌兰浩特自驾游全程攻略:1347公里的草原雪山之旅
胸部CT发现磨玻璃影怎么办?五类疾病治疗指南
智联招聘总裁张月佳:企业用人的底层逻辑与实战策略
Artefact上海成立中国研究中心,携手交大共探AI商业赋能新径
从孕育到更年:女性一生的营养需求与饮食建议
走进人山人海的GDC大会:AI出圈了,机器人的春天也来了
Artefact上海成立中国研究中心,携手交大共探AI商业赋能新径
Artefact上海成立中国研究中心,携手交大共探AI商业赋能新径
288幅高清地图展现中国古代历史地理变迁
衡阳市耒阳蔡伦纪念园景区
国防军vs党卫军:纳粹德国的两支平行军队
见证纳粹兴衰:希特勒近卫师的二战历程