万用表数据导出变化曲线图——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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2