python测量线长

2023-11-17

模块:

matplotlib
PIL
time
math
win32con
threading

代码:

mian.py:

from PIL import Image
import matplotlib.pyplot as plt
from image_show import show_your_image
from image_show import get_pixel
from image_show import get_line_long

#show_your_image(image,if_gray=) 展示图片






figure=plt.figure('get line long')
image= Image.open("line_try.jpg")
image_gray = image.convert('L')#图片变灰
#pixel_list=get_pixel(image=image_gray)
place_list=show_your_image(image=image, if_gray=True, figure=figure)
print(place_list)
line_len=get_line_long(place_list)
print(line_len)

#print(pixel_list)

image_show.py:

import matplotlib.pyplot as plt#该模块只用于展示图片
from PIL import Image
import time
from hot_key import Hotkey
import math

RUN=False #用来传递运行一次的参数
EXIT = False #用来传递退出的参数
hotkey = Hotkey()
hotkey.start()
hotkey.gethotkey()#查看热键是否被按 获得hotkey.hotkey1
x_place=0
y_place=0
place_list=[]


def show_your_image(image,figure,if_gray=False,):
    if if_gray==True:
        plt.imshow(image,cmap='gray') #cmap即colormap,颜色映射
    else:
        plt.imshow(image)
    plt.axis('off')  #关闭网格线

    figure.canvas.mpl_connect('motion_notify_event', call_back)
    plt.show()
    return place_list


def get_pixel(image,if_print='True'):
    '''是通过一列一列获取的 pixel_list[0]是第一列的像素'''

    time_read_pixel_start=time.time()
    image_width,image_height=image.size
    pixel_list=[]
    for i in range(image_width):
        column_list=[]
        for j in range(image_height):
            column_list.append(image.getpixel((i,j)))
        pixel_list.append(column_list)
    time_read_pixel_over=time.time()
    print('读取,解析像素用时:',time_read_pixel_over-time_read_pixel_start)
    return pixel_list

def show_new_image(image,pixel_list):
    image_new=Image.new('RGB',image.size,'white')
    for i in range(image.size[0]):
        for j in range(image.size[1]):
            image_new.putpixel((i, j), pixel_list[i][j])
    show_your_image(image=image_new,if_gray=True)

def get_line_long(place_list):
    len_list=[]
    for i in range(len(place_list)-1):
        x1=place_list[i][0]
        y1=place_list[i][1]
        x2=place_list[i+1][0]
        y2=place_list[i+1][1]
        len_x_to_y=math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
        len_x_to_y="%.3f" % (len_x_to_y)
        len_list.append(len_x_to_y)
    len_all=0
    for i in len_list:
        len_all+=float(i)
    print(len_list)
    return  len_all



def call_back(event):
    global x_place
    global y_place
    hotkey.gethotkey()

    try:
        x_place=event.xdata
        y_place=event.ydata
        if hotkey.hotkey1 == True:
            list1=[x_place,y_place]
            print(x_place,'   ',y_place)
            place_list.append(list1)
    except:
        pass


hot_key.py:

import win32con
import ctypes
import ctypes.wintypes
import threading
RUN=False #用来传递运行一次的参数
EXIT = False #用来传递退出的参数
user32 = ctypes.windll.user32  #加载user32.dll
id1=105 #注册热键的唯一id,用来区分热键
id2=106#id1:105为F9 id2:106为F10
class Hotkey(threading.Thread):  #创建一个Thread.threading的扩展类
    #hotkey=EXIT
    def gethotkey(self):
        global RUN
        #print('RUN=',RUN)
        self.hotkey1 = RUN
        RUN=False
    def run(self):
        global EXIT  #定义全局变量,这个可以在不同线程间共用。
        global RUN  #定义全局变量,这个可以在不同线程间共用。
        if not user32.RegisterHotKey(None, id1, 0, win32con.VK_F9):   # 注册快捷键F9并判断是否成功,该热键用于执行一次需要执行的内容。
            print("Unable to register id", id1) # 返回一个错误信息
        if not user32.RegisterHotKey(None, id2, 0, win32con.VK_F10):   # 注册快捷键F10并判断是否成功,该热键用于结束程序,且最好这么结束,否则影响下一次注册热键。
            print("Unable to register id", id2)
        #以下为检测热键是否被按下,并在最后释放快捷键
        try:
            msg = ctypes.wintypes.MSG()
            while True:
                if user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0:
                    if msg.message == win32con.WM_HOTKEY:
                        if msg.wParam == id1:
                            RUN = True
                        elif msg.wParam == id2:
                            EXIT=True
                            return
                    user32.TranslateMessage(ctypes.byref(msg))
                    user32.DispatchMessageA(ctypes.byref(msg))
        finally:
            user32.UnregisterHotKey(None, id1)#必须得释放热键,否则下次就会注册失败,所以当程序异常退出,没有释放热键,
            user32.UnregisterHotKey(None, id2)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python测量线长 的相关文章

随机推荐

  • Docker-数据卷(Data Volumes)&dockerfile

    目录 一 宿主机与容器之间的文件拷贝 1 1 容器中怎么上传项目 文件 1 2 从宿主机拷贝文件到容器 1 3 从容器中拷贝文件到宿主机 二 数据卷 三 数据卷容器 四 Dockerfile Dockerfile制作增强版 自定义cento
  • 电商前台项目——完成注册登录功能、路由守卫

    电商前台项目 完成注册登录功能 路由守卫 文章目录 电商前台项目 完成注册登录功能 路由守卫 一 完成注册部分 1 获取验证码 2 完成用户注册 二 登录 1 点击登录发送请求校验 2 保存下发的token 3 拿着token请求用户数据并
  • 音频处理工具SOX详解

    这里写自定义目录标题 前言 一 简介 二 基本使用 三 音频效果 前言 SoX 即 Sound eXchange 是一个跨平台 Windows Linux MacOS 等 的命令行实用程序 可以将各种格式的音频文件转换为需要的其他格式 So
  • 分布式事务的 N 种实现

    需求缘起 在微服务架构中 随着服务的逐步拆分 数据库私有已经成为共识 这也导致所面临的分布式事务问题成为微服务落地过程中一个非常难以逾越的障碍 但是目前尚没有一个完整通用的解决方案 其实不仅仅是在微服务架构中 随着用户访问量的逐渐上涨 数据
  • Spring Cloud (各厂)

    参考 https zhuanlan zhihu com p 98874444 Spring Cloud Netflix Spring Cloud 官方 Spring Cloud Zookeeper Spring Cloud Consul K
  • 【数据结构与算法】不就是数据结构

    前言 嗨喽小伙伴们你们好呀 好久不见了 我已经好久没更新博文了 之前因为实习没有时间去写博文 现在已经回归校园了 我看了本学期的课程中有数据结构这门课程 这么课程特别重要 因为之前学过一点 所以就想着深入学习一下子 毕竟这门课程对于考研和就
  • 基于卷积神经网络进行股价预测(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 CNN是一种人工神经网络 CNN的结构可以分为3层 卷积层 Convolutional Layer 主要作用是提取特征 池化层 Max Pooling Layer
  • C/C++中for循环详解,以及括号中三部分内容的含义和C++11标准for方法

    for循环语句 作用 满足循环条件 执行循环语句 语法 for 起始表达式 条件表达式 末尾循环体 循环语句 格式 for init statement condition expression statement 解析 init stat
  • C# 学习笔记

    不再是学生了 成了社畜了 公司主要技术栈是C 大一时候学C 学的很迷糊 总要重新学一下 入职已经20天了 也开始上手简单增删改查了 记录了一些C 相关的东西 只是还没有系统整理 WinForm 控件命名规范 ADO NET 连接数据库 Co
  • python与人工智能:神经网络和深度学习,卷积神经网络识别手写文字

    深度学习是用于建立 模拟人脑进行分析学习的神经网络 并模仿人脑的机制来解释数据的一种机器学习 技术 卷积神经网络是其中最火热的技术 如果要做事 想赶快入门 速度出活 请先死记住 深度学习 多层的神经网络 如果要写论文 要作报告 要闲聊 请坚
  • Python实现长短记忆神经网络(LSTM)预测经验模态分解(EMD)各模态变化的组合时间序列预测模型

    本实验使用环境为Anaconda3 Jupyter 调用Sklearn包 Keras包 请提前准备好 只提供数据格式而不提供数据 本人是代码缝合怪小白 望大牛指点 1 导包 主要包含pandas numpy 绘图包 日期格式 数学计算 py
  • 2022-2027年中国老年健康服务行业发展监测及投资战略研究报告

    报告类型 产业研究 报告格式 电子 纸介版 出品单位 华经产业研究院 本报告由华经产业研究院重磅推出 对中国老年健康服务行业的发展现状 竞争格局及市场供需形势进行了具体分析 并从行业的政策环境 经济环境 社会环境及技术环境等方面分析行业面临
  • Python配置VTK库

    方法一 安装anaconda 使用conda install安装 注意不同版本的Python对应不同的命令 适用于python3 3 6以下 install n envA c menpo vtk 7 python 3 or if you w
  • 使用IDEA实现java生成随机验证码

    package test200 checkCode 需求 定义方法实现随机产生一个5位的验证码 每位可能是数字 大写字母 小写字母 分析 定义一个方法 生成验证码返回 方法参数是位数 方法的返回值类型是String 在方法内部使用for循环
  • Flutter卡packages get解决方法(附默认插件地址及国内镜像修改)

    Flutter卡packages get解决方法 附默认插件地址及国内镜像修改 问题描述 发现原因 解决问题 本篇主要讲述Mac环境下的配置 其他操作系统的用户可相应参考 问题描述 为项目添加新的依赖包 一直卡flutter pub get
  • 吴恩达机器学习(九)Precision、Recall、F-score、TPR、FPR、TNR、FNR、AUC、Accuracy

    目录 0 前言 1 Precision Recall F score F measure 2 TPR FPR TNR FNR AUC 3 Accuracy 学习完吴恩达老师机器学习课程的机器学习系统设计 简单的做个笔记 文中部分描述属于个人
  • [转载]2014年Windows平台软件推荐:神器小工具(骨灰级)

    底层工具 If you know how to use Process Monitor competently people of both sexes will immediately find you more attractive S
  • Centos7安装supervisor详细教程

    supervisor 要安装的软件的名称 supervisord 装好supervisor软件后 supervisord用于启动supervisor服务 supervisorctl 用于管理supervisor配置文件中program和su
  • iOSApp发布状态为可供销售,但在AppStore搜索不到

    通过客服反馈 反馈官网 操作步骤 进入官网 gt 登录 gt App设置和分发 gt AppStore搜索和曝光率 gt 电话或电子邮件 App设置和分发 AppStore搜索和曝光率 电话或电子邮件 电话时 邮件时
  • python测量线长

    模块 matplotlib PIL time math win32con threading 代码 mian py from PIL import Image import matplotlib pyplot as plt from ima