巡检机器人之仪表识别系统

news2024/12/24 0:25:36

作者主页:爱笑的男孩。

博客简介:分享机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。 如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666@foxmail.com

目录

一、前言

二、项目介绍

三、项目展示

数字仪表

指针仪表

四、项目经验分享

分享一个跳动的爱心代码


一、前言

只要不放弃努力和追求,小草也有点缀春天的价值

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

二、项目介绍

         巡检机器人表计识别指的是利用人工智能技术,通过对表计进行拍照并进行图像处理,自动识别表计的种类、型号、读数等信息,实现对表计的自动巡检。通常包括摄像头、光源、图像采集设备、图像处理算法和数据处理部件等。在巡检过程中,机器人会通过摄像头拍摄表计上的图片数据然后会被传输到图像处理算法进行一系列的处理。处理完成后,数据会被发送到后端数据处理部件进行存储、分析和逻辑判断等操作。在实际应用中,表计识别具有高效、准确、安全等优点。机器人可代替人工实现巡检和数据采集,大幅提高工作效率,减少人为错误和事故概率,同时节约人力成本。

三、项目展示

        数字仪表和指针仪表成果展示

  • 数字仪表

  • 指针仪表

 

四、项目经验分享

        起初,我记得很清楚,我开始做这个项目的时候,我对如何做此项目一无所知,感到十分迷茫,我没有头绪,不清楚怎么去展开工作。但我并没有放弃,开始通过搜索资料、咨询他人及自我探索来提高知识水平及项目能力,我开始一点一点的去尝试,我从许多错误和挫折中学习,一步一步地朝着项目的完成去前进。

        我开始规划步骤并列出清单,以便快速了解每一个要素和得到清晰的成果。然后我着手于具体工作,跨出了第一步,有了一些小成功。但也过程中肯定遇到了许多挑战和困难,但我并没有轻言放弃,反而不断尝试和调整,成功地克服了这些困难。

        终于,我完成了项目并得到了认可,这让我感到非常欣慰和自豪。现在回想起来,虽然这个过程充满挑战,但我非常高兴我可以成就它。

        最后,分享一段话给大家:很多时候,我们不缺方法,缺的是一往无前的决心和魄力。不要在事情开始的时候畏首畏尾,不要在事情进行的时候瞻前顾后,唯有如此,一切才皆有可能。

分享一个跳动的爱心代码

希望这个跳动的心可以跟大家一起加油、努力!!!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# -*- coding: utf-8 -*-

import random
import time
from math import sin, cos, pi, log
from tkinter import *

CANVAS_WIDTH = 640  # 在这里改 画布的宽 最好和高成比例放大
CANVAS_HEIGHT = 480  # 在这里改 画布的高 最好和宽成比例放大
CANVAS_CENTER_X = CANVAS_WIDTH / 2  # 画布中心的X轴坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2  # 画布中心的Y轴坐标
IMAGE_ENLARGE = 11  # 在这里改 放大比例 画布放大后,心太小?把这个改大点
HEART_COLOR = "#e86184"  # 心的颜色 在这里改

WINDOWS_TITLE = '加油~'  # 窗口标题 在这里改
HEART_CENTER_TEXT = '不放弃,要坚持'  # 中间文字内容 在这里改
HEART_CENTER_TEXT_COLOR = '#FFD700'  # 中间文字颜色 在这里改

def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):
    """
    “爱心函数生成器”
    :param shrink_ratio: 放大比例
    :param t: 参数
    :return: 坐标
    """
    # 基础函数
    # x = 16 * (sin(t) ** 3)
    x = 14.6 * (sin(t) ** 3)  # 更尖
    # y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))
    y = -(14.5 * cos(t) - 4 * cos(2 * t) - 2 * cos(3 * t) - 0.5 * cos(4 * t))  # 更圆润

    # 放大
    x *= shrink_ratio
    y *= shrink_ratio

    # 移到画布中央
    x += CANVAS_CENTER_X
    y += CANVAS_CENTER_Y

    return int(x), int(y)


def scatter_inside(x, y, beta=0.15):
    """
    随机内部扩散
    :param x: 原x
    :param y: 原y
    :param beta: 强度
    :return: 新坐标
    """
    ratio_x = - beta * log(random.random())
    ratio_y = - beta * log(random.random())

    dx = ratio_x * (x - CANVAS_CENTER_X)
    dy = ratio_y * (y - CANVAS_CENTER_Y)

    return x - dx, y - dy


def shrink(x, y, ratio):
    """
    抖动
    :param x: 原x
    :param y: 原y
    :param ratio: 比例
    :return: 新坐标
    """
    force = -1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.6)  # 这个参数...
    dx = ratio * force * (x - CANVAS_CENTER_X)
    dy = ratio * force * (y - CANVAS_CENTER_Y)
    return x - dx, y - dy


def heart_curve(p):
    """
    爱心的跳动函数参数
    :param p: 参数
    :return: 正弦 + 贝塞尔
    """
    # return curve(p, (.4, .5, .2, .6))
    # https://cubic-bezier.com/ 调整参数的网站
    return curve(p, (.69, .75, .2, .95))  # 在这里改 爱心的贝塞尔曲线参数


def heart_halo_curve(p):
    """
    爱心光环的跳动函数参数
    :param p: 参数
    :return: 正弦 + 贝塞尔
    """
    # return curve(p, (.73,.55,.59,.92))
    # https://cubic-bezier.com/ 调整参数的网站
    return curve(p, (.75, .49, .46, .97))  # 在这里改 光环的贝塞尔曲线参数


def curve(p, b):
    """
    自定义曲线函数,调整跳动周期
    :param b: 贝塞尔参数
    :param p: 参数
    :return: 正弦 + 贝塞尔
    """

    # print('p:', p)
    t = sin(p)

    p0 = b[0]
    p1 = b[1]
    p2 = b[2]
    p3 = b[3]

    t1 = (1 - t)
    t2 = t1 * t1
    t3 = t2 * t1

    r = p0 * t3 + 3 * p1 * t * t2 + 3 * p2 * t * t * t1 + p3 * (t ** 3)  # 贝塞尔计算
    # r = 2 * (2 * sin(4 * p)) / (2 * pi)
    # print('r:', r)
    return r


class Heart:
    """
    爱心类
    """

    def __init__(self, generate_frame=20):
        self._points = set()  # 原始爱心坐标集合
        self._edge_diffusion_points = set()  # 边缘扩散效果点坐标集合
        self._center_diffusion_points = set()  # 中心扩散效果点坐标集合
        self.all_points = {}  # 每帧动态点坐标
        self.build(2000)  # 在这里改 初始的点数,太大可能运行缓慢

        self.generate_frame = generate_frame
        for frame in range(generate_frame):
            self.calc(frame)

    def build(self, number):
        # 爱心
        for _ in range(number):
            t = random.uniform(0, 2 * pi)  # 随机不到的地方造成爱心有缺口
            x, y = heart_function(t)
            self._points.add((x, y))

        # 爱心内扩散
        for _x, _y in list(self._points):
            for _ in range(3):
                x, y = scatter_inside(_x, _y, 0.05)
                self._edge_diffusion_points.add((x, y))

        # 爱心内再次扩散
        point_list = list(self._points)
        for _ in range(4000):
            x, y = random.choice(point_list)
            x, y = scatter_inside(x, y, 0.24)  # 0.24 这个参数改爱心中间的点点数量,越大数量越多
            self._center_diffusion_points.add((x, y))

    @staticmethod
    def calc_position(x, y, ratio):
        # 调整缩放比例
        force = 1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.47)  # 魔法参数

        dx = ratio * force * (x - CANVAS_CENTER_X) + random.randint(-1, 1)
        dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-1, 1)

        return x - dx, y - dy

    def calc(self, generate_frame):
        ratio = 10 * heart_curve(generate_frame / 10 * pi)  # 圆滑的周期的缩放比例

        halo_radius = int(4 + 6 * (1 + heart_halo_curve(generate_frame / 10 * pi)))
        halo_number = int(3000 + 4000 * abs(heart_halo_curve(generate_frame / 10 * pi) ** 2))

        all_points = []

        # 光环
        heart_halo_point = set()  # 光环的点坐标集合,去重
        for _ in range(halo_number):
            t = random.uniform(0, 2 * pi)  # 随机不到的地方造成爱心有缺口
            x, y = heart_function(t, shrink_ratio=heart_halo_curve(generate_frame / 10 * pi) + 11)  # 魔法参数
            x, y = shrink(x, y, halo_radius)
            if (x, y) not in heart_halo_point:
                # 处理新的点
                heart_halo_point.add((x, y))

                random_int_range = int(27 + heart_halo_curve(generate_frame / 10 * pi) * 4)
                x += random.randint(-random_int_range, random_int_range)
                y += random.randint(-random_int_range, random_int_range)
                size = random.choice((1, 1, 2))
                all_points.append((x, y, size))

        # 轮廓
        for x, y in self._points:
            x, y = self.calc_position(x, y, ratio)
            size = random.randint(1, 3)
            all_points.append((x, y, size))

        # 内容
        for x, y in self._edge_diffusion_points:
            x, y = self.calc_position(x, y, ratio)
            size = random.randint(1, 2)
            all_points.append((x, y, size))

        for x, y in self._center_diffusion_points:
            x, y = self.calc_position(x, y, ratio)
            size = random.randint(1, 2)
            all_points.append((x, y, size))

        self.all_points[generate_frame] = all_points

    def render(self, render_canvas, render_frame):
        for x, y, size in self.all_points[render_frame % self.generate_frame]:
            render_canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=HEART_COLOR)

    def frame_count(self):
        return self.generate_frame


def draw(main: Tk, render_canvas_dict: dict, render_heart: Heart, render_frame=0):
    """
    绘图函数
    :param main: TK面板
    :param render_canvas_dict: 画布缓存
    :param render_heart: 心类
    :param render_frame: 当前帧数
    :return: None
    """
    frame_index = render_frame % render_heart.frame_count()

    last_frame_index = (frame_index + render_heart.frame_count() - 1) % render_heart.frame_count()
    if last_frame_index in render_canvas_dict:
        render_canvas_dict[last_frame_index].pack_forget()

    if frame_index not in render_canvas_dict:

        canvas = Canvas(
            main,
            bg='black',
            height=CANVAS_HEIGHT,
            width=CANVAS_WIDTH
        )
        canvas.pack()

        render_heart.render(canvas, render_frame)
        canvas.create_text(
            CANVAS_CENTER_X,
            CANVAS_CENTER_Y,
            text=HEART_CENTER_TEXT,
            fill=HEART_CENTER_TEXT_COLOR,
            font=('楷体', 48, 'bold')
        )

        render_canvas_dict[frame_index] = canvas
    else:
        render_canvas_dict[frame_index].pack()

    main.after(
        40,  #画面切换间隔时间,越小帧数越高,但是可能会越卡
        draw, main, render_canvas_dict, render_heart, render_frame + 1)


if __name__ == '__main__':
    print('正在启动...')
    start_time = time.time()
    root = Tk()  # 一个Tk界面
    root.title(WINDOWS_TITLE)
    canvas_dict = {}
    heart = Heart(20)  #20为总帧数,帧数越大,花样越多,更占内存
    draw(root, canvas_dict, heart)
    end_time = time.time()
    root.mainloop()
    # 这个代码我忘记在哪里获取到的了,如涉权,麻烦告知并标明出处,我会及时修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是LVS

😘作者简介:一名99年运维岗位员工。👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。🙏创作不易,动动…

【brtc】视频下行弱网对抗优化 学习笔记

感谢孙健老师和livevideostack学习笔记百度云 音视频实时通信五个部分 1 RTC基础 需要云端服务器参与大量边缘服务器参与采集、前处理(图像处理)、压缩编码音频 3 A 回声消除、增益</

类ChatGPT逐行代码解读(1/2):如何从零起步实现Transformer、ChatGLM

前言 最近一直在做类ChatGPT项目的部署 微调&#xff0c;关注比较多的是两个&#xff1a;一个LLaMA&#xff0c;一个ChatGLM&#xff0c;会发现有不少模型是基于这两个模型去做微调的&#xff0c;说到微调&#xff0c;那具体怎么微调呢&#xff0c;因此又详细了解了一下微调代…

深度学习竞赛进阶技巧 - BLIP使用说明与实战

BLIP-2: 图像到文本的生成器 BLIP-2: Scalable Pre-training of Multimodal Foundation Models for the World’s First Open-source Multimodal Chatbot 1论文摘要 由于大规模模型的端到端的训练&#xff0c;视觉与语言的预训练模型的成本越来越高。本文提出了BLIP-2&#x…

网络原理(IP协议)

目录IP协议IP地址IP 地址由网络和主机两部分标识组成IP 地址的分类广播地址IP多播子网掩码路由IP 地址与路由控制IP 分包与组包什么是IP分片为什么要进行IP分片IP分片是如何组装的路径 MTU 发现IP协议 IP&#xff08;IPv4、IPv6&#xff09;相当于 OSI 参考模型中的第3层——网…

玩转ChatGPT:Auto-GPT项目部署与测评

一、Auto-GPT简介 最近&#xff0c;以ChatGPT为代表的超大规模语言模型火出了圈&#xff0c;各种二次开发项目也是层出不穷。 这周在AI圈炸街的是Auto-ChatGPT&#xff0c;在GitHub上已经61.4K的点赞了。 项目地址&#xff1a;https://github.com/Torantulino/Auto-GPT 用项…

命令设计模式(Command Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

文章目录概念组成角色相关图示示例代码框架中的运用适用场景概念 命令设计模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求的操作封装为一个对象&#xff0c;从而实现请求者和执行者之间的解耦。这样&#xff0c;请求者只需要知道如何发送…

Darknet19详细原理(含tensorflow版源码)

Darknet19原理 Darknet19是一个轻量级的卷积神经网络&#xff0c;用于图像分类和检测任务。 它是YOLOv2目标检测算法的主干网络&#xff0c;它的优点在于具有较少的参数和计算量&#xff0c;在计算速度和精度之间取得了良好的平衡&#xff0c;同时在训练过程中也具有较高的准确…

MobileNetV1详细原理(含torch源码)

目录 MobileNetV1原理 MobileNet V1的网络结构如下&#xff1a; 为什么要设计MobileNet&#xff1a; MobileNetV1的主要特点如下&#xff1a; MobileNetV1的创新点&#xff1a; MobileNetV1源码&#xff08;torch版&#xff09; 训练10个epoch的效果 MobileNetV1原理 Mo…

玩转ChatGPT:中科院ChatGPT Academic项目部署与测评

一、ChatGPT Academic简介 最近&#xff0c;以ChatGPT为代表的超大规模语言模型火出了圈&#xff0c;各种二次开发项目也是层出不穷。 比如说今天我们玩弄的这个“ChatGPT Academic”&#xff0c;在GitHub上已经13.7K的点赞了。 项目地址&#xff1a;https://github.com/bina…

因为这5大工具,同事直呼我时间管理小王子

写在前面 关于时间管理、如何做计划、如何提高执行力等等相关话题其实很早之前我就想写了&#xff0c;但一直拖着迟迟没有动笔。 在之前的一篇文章里我曾详细聊过自己对于时间管理&#xff0c;如何提高执行力&#xff0c;以及如何摆脱那种没有灵魂的任务计划的一些思考和做法…

【C语言】深度理解指针(中)

前言✈ 上回说到&#xff0c;我们学习了一些与指针相关的数据类型&#xff0c;如指针数组&#xff0c;数组指针&#xff0c;函数指针等等&#xff0c;我们还学习了转移表的基本概念&#xff0c;学会了如何利用转移表来实现一个简易计算器。详情请点击传送门&#xff1a;【C语言…

Windows 下安装和使用Redis

Redis 一般安装在Linux中&#xff0c; 但有时出于学习和其他目的&#xff0c;需要在Windows机器运行Redis&#xff0c; 本篇介绍如果在&#xff37;indows中运行和使用Redis。 关于Redis的基本介绍可以参考&#xff1a; Redis介绍、安装与初体验 Windows 下Redis的下载 可…

【NestJs】日志收集

Nest 附带一个默认的内部日志记录器实现&#xff0c;它在实例化过程中以及在一些不同的情况下使用&#xff0c;比如发生异常等等&#xff08;例如系统记录&#xff09;。这由 nestjs/common 包中的 Logger 类实现。你可以全面控制如下的日志系统的行为&#xff1a; 完全禁用日…

jenkins windows安装 部署项目 前端 后端

安装 需要安装的程序&#xff1a; 1.下载jenkins windows版本 2.400 此版本需要jdk11 https://www.jenkins.io/ 按着提示安装即可 2.下载jdk 11 https://login.oracle.com/ 按着提示安装即可 部署pc 1.新建项目 2.源码管理 3.添加git用户 4.Build Steps 构建 初始化np…

vue2数据响应式原理(2)搭建webpack认识一下Object.defineProperty

在1中我们讲到 Object.defineProperty() 是vue2实现数据响应的关键 那么我们就来好好的看看这个方法 方法字面意思是定义属性 而他是通过Object对象调用的 所以说 他是用来控制对象的某个属性的 比较官方的解释是 object.defineProperty() 方法会直接在一个对象上定义一个新属…

单片机添加版本号的一些小技巧

平时我们写程序&#xff0c;通常都会备注软件版本&#xff0c;那么&#xff0c;怎么在单片机中保存版本信息呢&#xff1f; 方法其实有很多&#xff0c;但基本原理都是在指定存储区域&#xff08;Flash&#xff09;中写入软件版本信息。 实现方法 下面就分享一个最常用&#xf…

算法风险防控

算法风险防控是指在算法应用过程中&#xff0c;通过对算法应用场景、数据、模型和结果等多个方面的风险进行评估和控制&#xff0c;以保障算法应用的安全性、可靠性和合法性。以下是一些常见的算法风险防控措施&#xff1a; 数据风险防控&#xff1a;在算法应用中&#xff0c;…

【python】Python基础入门:从变量到异常处理

天池实验室代码链接&#xff1a;https://tianchi.aliyun.com/notebook-ai/home#notebookLabId491001 简介 Python 是一种通用编程语言&#xff0c;其在科学计算和机器学习领域具有广泛的应用。如果我们打算利用 Python 来执行机器学习&#xff0c;那么对 Python 有一些基本的了…

51单片机定时器与计数器

文章目录 51单片机定时器与计数器一、定时器与计数器的结构与功能计数功能定时功能 二、定时器与计数器的控制TMOD 工作方式寄存器TCON 定时器控制寄存器 三、仿真案例(一).8个LED 1 秒周期闪烁。(二) 产品包装生产线。 51单片机定时器与计数器 一、定时器与计数器的结构与功能…