万用表数据导出变化曲线图——pycharm实现视频数据导出变化曲线图

2024-03-10 07:44

本文主要是介绍万用表数据导出变化曲线图——pycharm实现视频数据导出变化曲线图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

万用表数据导出变化曲线图——pycharm实现视频数据导出变化曲线图

  • 一、效果展示
  • 二、环境配置
  • 三、代码构思
  • 四、代码展示
  • 五、代码、python环境包链接

一、效果展示

图1.1 效果展示
(左图:万用表视频截图;右图:表中数据变化曲线图)

二、环境配置

软件:PyCharm 2021.1.3 (Professional Edition)

python环境包:放在文章结尾文件链接,其中 .yaml 文件

三、代码构思

Created with Raphaël 2.3.0 Start 预备工作:拍摄一段万用表视频 预备工作:裁剪视频、读取视频每秒帧数 代码1:将视频按帧数截屏至某文件夹下 代码2:ocr 截屏文件夹下所有文件 代码3:正则表达式筛选截图中数字数据,并修正数据 代码4:绘图 End

四、代码展示

# functions.py
import cv2
import os
import glob# video to img
def extract_frames(video_path, output_folder, interval):cap = cv2.VideoCapture(video_path)frame_count = 0while cap.isOpened():ret, frame = cap.read()if not ret:breakif frame_count % interval == 0:output_path = f"{output_folder}/frame_{interval}_{frame_count // interval}.jpg"cv2.imwrite(output_path, frame)frame_count += 1cap.release()# 计数文件夹里的文件个数
def count_files_in_directory(directory):return len([f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))])# 删除文件夹下的图片
def del_imgs(folder_path):# 定义要删除的图片文件夹路径# 获取文件夹中所有图片文件的路径image_files = glob.glob(os.path.join(folder_path, '*.jpg')) + glob.glob(os.path.join(folder_path, '*.png'))# 遍历所有图片文件并删除for image_file in image_files:os.remove(image_file)
# img_to_plot.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocatordef wyb_plot(Real_time_value, Maximum, Average, Minimum, fps, title, x_scale=2, y_scale=0.500):x = [i for i in range(len(Real_time_value))]plt.figure(dpi=200)x_major_locator = MultipleLocator(x_scale)# 把x轴的刻度间隔设置为2,并存在变量里y_major_locator = MultipleLocator(y_scale)# 把y轴的刻度间隔设置为0.0500,并存在变量里ax = plt.gca()# ax为两条坐标轴的实例ax.xaxis.set_major_locator(x_major_locator)# 把x轴的主刻度设置为1的倍数ax.yaxis.set_major_locator(y_major_locator)# 把y轴的主刻度设置为10的倍数# # 绘制柱状图# y = Real_time_value# plt.bar(x, y)# 绘制曲线图plt.plot(x, Real_time_value, label='Real_time_value')plt.plot(x, Maximum, label='Maximum')plt.plot(x, Average, label='Average')plt.plot(x, Minimum, label='Minimum')# 绘制曲线图,并标出最大值和最小值max_y = np.max(Real_time_value)min_y = np.min(Real_time_value)max_index = np.argmax(Real_time_value)min_index = np.argmin(Real_time_value)plt.annotate("(%s,%s)" % (x[max_index], max_y), xy=(x[max_index], max_y), xytext=(x[max_index], max_y + 0.5),textcoords='offset points',color='red')plt.savefig('wyb_plot.png')plt.annotate("(%s,%s)" % (x[min_index], min_y), xy=(x[min_index], min_y), xytext=(x[min_index], min_y - 0.5),textcoords='offset points',color='green')max_y = np.max(Maximum)min_y = np.min(Maximum)max_index = np.argmax(Maximum)min_index = np.argmin(Maximum)plt.annotate("(%s,%s)" % (x[max_index], max_y), xy=(x[max_index], max_y), xytext=(x[max_index], max_y + 0.5),textcoords='offset points',color='red')plt.savefig('wyb_plot.png')plt.annotate("(%s,%s)" % (x[min_index], min_y), xy=(x[min_index], min_y), xytext=(x[min_index], min_y - 0.5),textcoords='offset points',color='green')max_y = np.max(Average)min_y = np.min(Average)max_index = np.argmax(Average)min_index = np.argmin(Average)plt.annotate("(%s,%s)" % (x[max_index], max_y), xy=(x[max_index], max_y), xytext=(x[max_index], max_y + 0.5),textcoords='offset points',color='red')plt.savefig('wyb_plot.png')plt.annotate("(%s,%s)" % (x[min_index], min_y), xy=(x[min_index], min_y), xytext=(x[min_index], min_y - 0.5),textcoords='offset points',color='green')max_y = np.max(Minimum)min_y = np.min(Minimum)max_index = np.argmax(Average)min_index = np.argmin(Average)plt.annotate("(%s,%s)" % (x[max_index], max_y), xy=(x[max_index], max_y), xytext=(x[max_index], max_y + 0.5),textcoords='offset points',color='red')plt.savefig('wyb_plot.png')plt.annotate("(%s,%s)" % (x[min_index], min_y), xy=(x[min_index], min_y), xytext=(x[min_index], min_y - 0.5),textcoords='offset points',color='green')plt.xlabel('x/'+str(fps)+"fps")plt.ylabel('y/A')plt.title(title)plt.legend()plt.savefig('wyb_plot.png')# plt.show()
# main.py
import functions
import numpy as np
import ocr_imgs
import img_to_plot# 用户告知!/ Users informed!
print("Welcome to use wyb_project!")
print("Please place the video under the video folder")# 逻辑判断 / logical judgment
video_path_lj = int(input("Whether to set the video_path( default video_path = ./video/wybdata.mp4)(1/0): "))
interval_lj = int(input("Whether to set the interval( default screenshot / fps = 30)(1/0): "))video_path = "./video/wybdata.mp4"
output_folder = "./img"
# 输入 video name / Enter your video name
if video_path_lj:vi_name = input("Enter a video name(mind add suffix): ")video_path = "./video/" + vi_name# screenshot/fps
interval = 30  # 默认每隔30帧截取一张图片
if interval_lj:interval = int(input("screenshot / fps: "))# screenshot
extract_frames = functions.extract_frames
extract_frames(video_path, output_folder, interval)# 计数文件夹里的文件个数
directory = output_folder
count_files_in_directory = functions.count_files_in_directory
file_count = count_files_in_directory(directory) - 1# 定义要遍历的文件夹路径
folder_path = output_folder
# 每帧计数
frame_count = 0
# 数据数组
data_str = []
# 丢失数组
data_lost = []# ocr imgs
ocr_imgs = ocr_imgs.ocr_imgs(file_count, folder_path, interval, data_str, data_lost)data_float = [float(x) for x in data_str]# 绘图
# 定义万用表绘制的数据列表
Real_time_value = []
Maximum = []
Average = []
Minimum = []for i in range(len(data_float)):if i % 4 == 0:Real_time_value.append(data_float[i])Maximum.append(data_float[i + 1])Average.append(data_float[i + 2])Minimum.append(data_float[i + 3])fps = interval  # 30
Real_time_value = np.array(Real_time_value)
Maximum = np.array(Maximum)
Average = np.array(Average)
Minimum = np.array(Minimum)x_y_lj = int(input("Whether to set x and y axis scale( default x_scale=2, y_scale=0.500)(1/0): "))
if x_y_lj:x_scale = float(input("input x axis scale: "))y_scale = float(input("input y axis scale: "))title_lj = int(input("Whether to set the title of plot ( default \"wyb_plot\")(1/0): "))
if title_lj:title = input("enter a title for plot: ")title = "wyb_plot"
wyb_plot = img_to_plot.wyb_plot(Real_time_value, Maximum, Average, Minimum, fps, title, x_scale=2, y_scale=0.500)img_del_lj = int(input("Whether to delete imgs of imgs folder( default delete)(1/0): "))
if img_del_lj:folder_path = output_folderdel_imgs  = functions.del_imgs(folder_path)
# ocr_imgs.py
from cnocr import CnOcr
import redef ocr_imgs(file_count, folder_path, interval, data_str, data_lost):# 遍历文件夹文件(图片),进行文字识别for frame_count in range(file_count):img_fp = f"{folder_path}/frame_{interval}_{frame_count}.jpg"ocr = CnOcr()  # 所有参数都使用默认值out_list = ocr.ocr(img_fp)data_list = []for dict in out_list:text = dict.get('text')match = re.search(r'[0-9Oo][.,][0-9Oo][0-9Oo][0-9Oo][0-9Oo]|[Q][0-9Oo][0-9Oo][0-9Oo][0-9Oo]', text)  # 正则化匹配if match:result = match.group()# print(result)# with open('output.txt', 'a') as f:#     print(result, file=f)result = result.replace('O', '0').replace('o', '0').replace(',', '.')  # 修正数据data_list.append(result)# with open('output.txt', 'a') as f:#     print(result, file=f)if len(data_list) % 4 == 0:data_str += data_listelse:print("数据丢失," + "frame_" + str(interval) + "_" + str(frame_count) + ".jpg" + "未采集")data_lost.append(frame_count)# 手动采集图片数据 / manual captureman_cap = int(input("Whether manual collection(1/0): "))if man_cap:for frame in data_lost:data_ins = 0for i in range(4):if i == 0:data_ins = (input("rea: "))if i == 1:data_ins = (input("max: "))if i == 2:data_ins = (input("ave: "))if i == 3:data_ins = (input("min: "))data_str.insert((file_count - len(data_list) + 1) * 4 + i, data_ins)

五、代码、python环境包链接

wyb_project https://www.alipan.com/s/dKwQhvHpb4Z 提取码: 6mm1
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

这篇关于万用表数据导出变化曲线图——pycharm实现视频数据导出变化曲线图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793536

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象