20230223-给定坐标系中矩形四个顶点,计算左上角的顶点

<Halcon> 计算任意矩形四个顶点坐标 计算任意矩形四个顶点坐标 1、计算矩形与水平方向的夹角Phi(smallest_rectangle2:矩形长与水平的夹角,- pi / 2 < Phi <= pi / 2); 2、若夹角大于45°或者小于-45°,角度转换为矩形宽与水平的夹角,长宽互换; Halcon通用代码 *计算矩形的中间点、角度、及长宽(一半) smallest_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2) if(abs(deg(Phi))&gt 阅读详情

关注公众号 `N学无止界` 获取更多

目录:

一、环境说明

二、背景

三、示例代码

四、思考总结

一、环境说明

本机环境:windows10 操作系统
使用工具:Visual Studio Code 1.74.3(user setup)
Python版本:Python --version
            Python 3.9.16
pip版本: pip --version
         pip 22.3.1 from C:\Users\Jack\.conda\envs\py\lib\site-packages\pip (python 3.9)

弱依赖条件:
   本示例程序默认你已经阅读过 https://blog.youkuaiyun.com/Jack_software/article/details/129178322 文章,并获取到示例输出的内容

备注:
安装Python库命令: pip install [库名]=[版本号]  
    比如:  pip install pyzbar==0.1.9
下载缓慢可以尝试利用下面命令更新国内镜像仓库
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
    pip config set install.trusted-host https://pypi.tuna.tsinghua.edu.cn 

二、背景

前情回顾 : 20230223-基于pyzbar识别条形码并标注示例-优快云博客

该博文末尾说道 “针对识别不到或者图片质量差识别失败的条形码可以用OCR模式识别条形码”,过程中遇到最表重排问题。针对识别到的结果想按照一定的顺序显示,为了更好的接近人体看的顺序(这里以先上后下,先左后右)顺序给出输出结果。

在zbr给出的结果和OCR的结果合并后,导致原来的顺序(我遇到的图片有多个条形码需要识别)没有按照特定的顺序展示,因此,本次对结果进行重排。

三、示例代码

说明:本示例以 20230223-基于pyzbar识别条形码并标注示例-优快云博客 的坐标,信息针对外接矩形找到 “左上角的点”

相关定义:

何为左上角的点:

ChatGPT定义:

程序代码:

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

# __ author:Jack
# date: 2023-02-23

def sort_points():

    #Decoded(data=b'QR Code\xc3\x82\xc3\xab\xc3\x8a\xc3\x87\xc3\x93\xc3\x89\xc3\x88\xc3\x95\xc2\xb1\xc2\xbeDenso\xc2\xb9\xc2\xab\xc3\x8b\xc2\xbe\xc3\x93\xc3\x9a1994\xc3\x84\xc3\xaa9\xc3\x94\xc3\x82\xc3\x91\xc3\x90\xc3\x96\xc3\x86\xc2\xb5\xc3\x84\xc3\x92\xc2\xbb\xc3\x96\xc3\x96\xc2\xbe\xc3\x98\xc3\x95\xc3\xb3\xc2\xb6\xc3\xbe\xc3\x8e\xc2\xac\xc3\x82\xc3\xab\xc2\xb7\xc3\xbb\xc2\xba\xc3\x85\xc2\xa3\xc2\xac\xc3\x8b\xc3\xbc\xc2\xb3\xc3\xbd\xc2\xbe\xc3\x9f\xc3\x93\xc3\x90\xc3\x92\xc2\xbb\xc3\x8e\xc2\xac\xc3\x8c\xc3\xb5\xc3\x82\xc3\xab\xc2\xbc\xc2\xb0\xc3\x86\xc3\xa4\xc3\x8b\xc3\xbc\xc2\xb6\xc3\xbe\xc3\x8e\xc2\xac\xc3\x8c\xc3\xb5\xc3\x82\xc3\xab\xc3\x8b\xc3\xb9\xc2\xbe\xc3\x9f\xc3\x93\xc3\x90\xc2\xb5\xc3\x84\xc3\x90\xc3\x85\xc3\x8f\xc2\xa2\xc3\x88\xc3\x9d\xc3\x81\xc2\xbf\xc2\xb4\xc3\xb3\xc2\xa1\xc2\xa2\xc2\xbf\xc3\x89\xc2\xbf\xc2\xbf\xc3\x90\xc3\x94\xc2\xb8\xc3\x9f\xc2\xa1\xc2\xa2\xc2\xbf\xc3\x89\xc2\xb1\xc3\xad\xc3\x8a\xc2\xbe\xc2\xba\xc2\xba\xc3\x97\xc3\x96\xc2\xbc\xc2\xb0\xc3\x8d\xc2\xbc\xc3\x8f\xc3\xb3\xc2\xb6\xc3\xa0\xc3\x96\xc3\x96\xc3\x8e\xc3\x84\xc3\x97\xc3\x96\xc3\x90\xc3\x85\xc3\x8f\xc2\xa2\xc2\xa1\xc2\xa2\xc2\xb1\xc2\xa3\xc3\x83\xc3\x9c\xc2\xb7\xc3\x80\xc3\x8e\xc2\xb1\xc3\x90\xc3\x94\xc3\x87\xc2\xbf\xc2\xb5\xc3\x88\xc3\x93\xc3\x85\xc2\xb5\xc3\xa3\xc3\x8d\xc3\xa2\xc2\xa3\xc2\xac\xc2\xbb\xc2\xb9\xc2\xbe\xc3\x9f\xc3\x93\xc3\x90\xc3\x88\xc3\xa7\xc3\x8f\xc3\x82\xc3\x96\xc3\xb7\xc3\x92\xc2\xaa\xc3\x8c\xc3\x98\xc2\xb5\xc3\xa3\xc2\xa3\xc2\xba', type='QRCODE', rect=Rect(left=1374, top=511, width=162, height=163), polygon=[Point(x=1374, y=511), Point(x=1374, y=673), Point(x=1536, y=674), Point(x=1535, y=511)], quality=1, orientation='UP')
    #Decoded(data=b'Aux(124)-TR', type='CODE128', rect=Rect(left=550, top=599, width=287, height=71), polygon=[Point(x=550, y=599), Point(x=550, y=669), Point(x=837, y=670), Point(x=837, y=600)], quality=72, orientation='UP')
    #Decoded(data=b'A000800A', type='CODABAR', rect=Rect(left=53, top=551, width=292, height=104), polygon=[Point(x=53, y=551), Point(x=53, y=655), Point(x=345, y=652), Point(x=345, y=554)], quality=101, orientation='UP')Decoded(data=b'123ABC', type='CODE39', rect=Rect(left=61, top=418, width=294, height=45), polygon=[Point(x=61, y=419), Point(x=61, y=463), Point(x=355, y=458), Point(x=355, y=418)], quality=44, orientation='UP')     
    #Decoded(data=b'BJ100080', type='CODE93', rect=Rect(left=535, top=381, width=290, height=94), polygon=[Point(x=535, y=381), Point(x=535, y=475), Point(x=825, y=474), Point(x=825, y=382)], quality=95, orientation='UP')Decoded(data=b'69012341', type='EAN8', rect=Rect(left=169, top=227, width=201, height=90), polygon=[Point(x=169, y=227), Point(x=169, y=317), Point(x=265, y=317), Point(x=370, y=316), Point(x=370, y=228)], quality=144, orientation='UP')
    #Decoded(data=b'0089000006007', type='EAN13', rect=Rect(left=681, top=207, width=147, height=83), polygon=[Point(x=681, y=207), Point(x=681, y=289), Point(x=828, y=290), Point(x=828, y=212)], quality=82, orientation='UP')
    #Decoded(data=b'6901234567892', type='EAN13', rect=Rect(left=151, top=32, width=264, height=90), polygon=[Point(x=151, y=33), Point(x=151, y=121), Point(x=287, y=122), Point(x=415, y=122), Point(x=415, y=32)], quality=144, orientation='UP')
    #Decoded(data=b'0089600124569', type='EAN13', rect=Rect(left=635, top=16, width=253, height=84), polygon=[Point(x=635, y=17), Point(x=635, y=99), Point(x=888, y=100), Point(x=888, y=16)], quality=132, orientation='UP')
    #Decoded(data=b'1234567890', type='I25', rect=Rect(left=1051, top=0, width=292, height=101), polygon=[Point(x=1051, y=1), Point(x=1051, y=101), Point(x=1343, y=100), Point(x=1343, y=0)], quality=102, orientation='UP')

    #Rect(left=1374, top=511, width=162, height=163), polygon=[Point(x=1374, y=511), Point(x=1374, y=673), Point(x=1536, y=674), Point(x=1535, y=511)]
    #Rect(left=550, top=599, width=287, height=71), polygon=[Point(x=550, y=599), Point(x=550, y=669), Point(x=837, y=670), Point(x=837, y=600)]
    #Rect(left=53, top=551, width=292, height=104), polygon=[Point(x=53, y=551), Point(x=53, y=655), Point(x=345, y=652), Point(x=345, y=554)]
    #Rect(left=61, top=418, width=294, height=45), polygon=[Point(x=61, y=419), Point(x=61, y=463), Point(x=355, y=458), Point(x=355, y=418)] 
    #Rect(left=535, top=381, width=290, height=94), polygon=[Point(x=535, y=381), Point(x=535, y=475), Point(x=825, y=474), Point(x=825, y=382)]
    #Rect(left=169, top=227, width=201, height=90), polygon=[Point(x=169, y=227), Point(x=169, y=317), Point(x=265, y=317), Point(x=370, y=316), Point(x=370, y=228)]
    #Rect(left=681, top=207, width=147, height=83), polygon=[Point(x=681, y=207), Point(x=681, y=289), Point(x=828, y=290), Point(x=828, y=212)]
    #Rect(left=151, top=32, width=264, height=90), polygon=[Point(x=151, y=33), Point(x=151, y=121), Point(x=287, y=122), Point(x=415, y=122), Point(x=415, y=32)]
    #Rect(left=635, top=16, width=253, height=84), polygon=[Point(x=635, y=17), Point(x=635, y=99), Point(x=888, y=100), Point(x=888, y=16)]
    #Rect(left=1051, top=0, width=292, height=101), polygon=[Point(x=1051, y=1), Point(x=1051, y=101), Point(x=1343, y=100), Point(x=1343, y=0)]
    arr = [[[1374, 511], [1374, 673], [1536, 674], [1535, 511]],\
            [[550, 599], [550, 669], [837, 670], [837, 600]],\
            [[53, 551], [53, 655], [345, 652], [345, 554]], \
            [[61, 419], [61, 463], [355, 458], [355, 418]], \
            [[535, 381], [535, 475], [825, 474], [825, 382]], \
            [[169, 227], [169, 317], [265, 317], [370, 316], [370, 228]],\
            [[681, 207], [681, 289], [828, 290], [828, 212]], \
            [[151, 33], [151, 121], [287, 122], [415, 122], \
            [415, 32]], [[635, 17], [635, 99], [888, 100], \
            [888, 16]], [[1051, 1], [1051, 101], [1343, 100], [1343, 0]]]    
    #--- 1374 511
    #--- 550 599
    #--- 53 551
    #--- 61 418
    #--- 535 381
    #--- 169 227
    #--- 681 207
    #--- 151 32
    #--- 635 16
    #--- 1051 0
    for i in arr:
        p = getLeftTopPoint(i)
        print('---',p)
    #--- (1374, 511)
    #--- (550, 599)
    #--- (53, 551)
    #--- (61, 419)
    #--- (535, 381)
    #--- (169, 227)
    #--- (681, 207)
    #--- (151, 33)
    #--- (635, 17)
    #--- (1051, 1)

'''
获取外接矩形左上角的点
'''
def getLeftTopPoint(points):
    # 距离x轴最近的2个点
    sort_1 = sorted(points,key=lambda x:(x[1],x[0]))[:2]
    # 距离y轴最近的1个点
    sort_2 = sorted(sort_1,key=lambda x:x[0])[0]
    return tuple(sort_2)
    #tuple(sorted(sorted(points,key=lambda x:(x[1],x[0]))[:2],key=lambda x:x[0])[0])

if __name__=='__main__':
    sort_points()

四、思考总结

## 核心算法
'''
获取外接矩形左上角的点
'''
def getLeftTopPoint(points):
    # 距离x轴最近的2个点
    sort_1 = sorted(points,key=lambda x:(x[1],x[0]))[:2]
    # 距离y轴最近的1个点
    sort_2 = sorted(sort_1,key=lambda x:x[0])[0]
    return tuple(sort_2)
    #tuple(sorted(sorted(points,key=lambda x:(x[1],x[0]))[:2],key=lambda x:x[0])[0])

if __name__=='__main__':
    sort_points()

上述算法按照逻辑思维按照y轴排序求的最小的两个点,紧接着在找到最小的x点,最后求得左上角的点。根据需要的场景满足业务需求,后续如果遇到对坐标进行进一步识别,比如 左上角,右上角,右下角,左下角 顺序进行重排,欢迎大家沟通。

把矩形的四个顶点按照一定的顺序排好(左上、右上、右下、左下,符合人的视角). /* *@ 作 用:把矩形的四个顶点按照一定的顺序排好(左上、右上、右下、左下,符合人的视角). * 因为图像坐标系Y正方向朝下的缘故,排序完成之后实际上左上点、右上点的图像Y坐标比较小。 * 首先取四个点中Y坐标进行排序,最小的两个作为左上、右上(再按左上点的X坐标小于右上点)。 *@ pts: 图像坐标系下的坐标。 *@ sorted:排序之后的坐标。 *@ 返回值: 0:成功。非零值:失败 */ int RectFixedpointSort(const cv::Poi. 阅读详情

相关推荐

Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形

Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。

Giver的博客 1928

如何判断4个点坐标是左上角\左下角\右上角\右下角

qq_35455503的博客 4157

Optisystem软件与Matlab软件的联合数据读取

目录 Matlab软件程序编写 Optisystem软件的连接与设置 数据读取结果 Matlab软件程序编写 利用Matlab软件按照下图编写程序,保存为getdata.m文件。 OutputPort1 =InputPort1; fileID=fopen('OSAdata.txt','wt'); fprintf(fileID,'%f\n',OutputPort1.Sampled.Signal); fclose(fileID); Optisystem软件的连接与设置 (以基于线性插值法

Vivian_Chen_的博客 4853

确定四边形的四个顶点

确定四边形顶点的方法为:在四边形的内部任意取一个点,将四边形分割成四块,再在对应的块中求出边缘距离该点的最大距离,记为一个角点。缺陷:对于部分钝角的角点,会出现误差,导致钝角的角点不准确,所以可以根据已有的正确点进行重新确认点的位置。主要思路为:在对应的块部分,求取最小的余弦值,纠正距离计算的角点。 一下是简单的代码,没有做优化何处理,纯当作思路思考! #include&lt;iostrea...

XIANGYANGYANGyang的博客 6746

poincare截点

poincare映射定义比较抽象,简单理解就是每个原始周期取一个点,表现在程序中的思路如下: 以激励的周期T0为poincare的原始周期,设置1个周期取m个点,取N个周期设置T0/m为ode45的步长,每个周期的 i*m个点处取一个点(i=0.0-1.0),把这些点画出来就行了。有几个点就是几倍周期。 (注意:ode45算法是变步长的算法,所以一定要之前自己设置步长,我在这个地方吃了很大一个亏...

小树 3007

芯片良率提升:从设计到制造的系统性工程实践

在半导体制造领域,良率是衡量生产效率和成本控制的核心指标,直接关系到芯片的经济效益与市场竞争力。其本质是合格芯片占总产出芯片的百分比,提升良率需要从设计源头到制造末端的全流程协同优化。从技术原理看,它涉及可制造性设计、工艺过程控制、缺陷检测与根因分析等多个复杂环节,尤其在先进制程下,随机缺陷和参数变异成为主要挑战。其技术价值不仅在于降低单颗芯片成本,更能加速产品上市、保障可靠性,并成为企业技术实力的关键体现。应用场景贯穿智能手机、数据中心、自动驾驶和人工智能等所有高端芯片领域。本文将结合【芯片制造】与【良率

weixin_42526068的博客 632

Python 之Opencv的Numpy函数:矩形框四个顶点顺时针排序

图像处理可以简单理解为对数据处理的过程,针对图像中一个矩形区域给出的4个顶点坐标,按照固定顺序对4个顶点坐标进行顺时针排序。坐标的这种排序方式是进行透视变换、匹配对象角点、计算距离等操作的基础。...

kamille1024的博客 3612

探索如何利用CST和ADS进行DDR的SIPI联合仿真

本文系统介绍了CST和ADS两款工具进行DDR信号完整性/电源完整性(SI/PI)联合仿真的方法。CST采用工作室协同方式,通过PCB布局导入、材料设置、模型分配等步骤,重点分析了电源阻抗优化和信号波形质量。ADS则利用SIPro、PIPro等专用工具,突出系统级验证和自动化优化功能。两者各有优势:CST擅长3D结构精确建模,ADS更适于快速系统验证。文章建议可根据项目需求混合使用两种工具,并提供了模型简化、频带选择等实用技巧。通过对比分析,为工程师选择仿真工具提供了决策参考。

一只豌豆象的博客 1150

OpenCV自学笔记4:轮廓检测

轮廓检测引言 在计算机视觉中,轮廓检测是一个十分重要的任务。与边缘不同,图像中的轮廓包含更多的实际意义。OpenCV提供了 findContours() 函数和 drawContours() 函数实现轮廓的检测和绘制————————————————————OpenCV轮廓检测的例子# -*- coding:utf-8 -*-import cv2# Step1. 读入图像 image = cv2.i

两鬓已不能斑白的专栏 3238

Jetson nano 系列之2—板载摄像头IMX219启动

我选用的是亚博科技jetson nano的开发板。

驽马十驾,功在不舍;锲而不舍,金石可镂。 4274

3D深度饼图的QT实现

首先,我们需要创建一个QT项目并创建一个窗口,用于显示我们的饼图。在QT Creator中,选择创建一个新的QT Widgets应用程序项目,并创建一个新的窗口类。在本文中,我将介绍如何使用QT实现一个3D深度饼图(Pie 3D)的可视化效果。在构造函数中,我们将创建一个饼图(QChartView)并设置饼图的数据。这是一个简单的示例,您可以根据需要自定义和扩展代码来创建更复杂的饼图。现在,我们已经完成了3D深度饼图的QT实现。您将看到一个具有相应数据的3D深度饼图显示在窗口中。3D深度饼图的QT实现。

CodeJolt的博客 277

opencv求轮廓外接矩形坐标

#include "pch.h" #include <iostream> #include<opencv2/highgui/highgui.hpp> #include<opencv2\opencv.hpp> using namespace cv; using namespace std; vector<Point2f> srcTri(4); vec...

qq_36786800的博客 1362

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

根据四个点坐标排列出左上右上右下左下位置关系

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

shuwu 8905

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

本次实现有几个前提:可以将情况分为两种,即θ∈[0,π/2]\theta \in [0, \pi/2]θ∈[0,π/2]和θ∈[π/2,π]\theta \in [\pi/2, \pi]θ∈[π/2,π]先看第一种情况θ∈[0,π/2]\theta \in [0, \pi/2]θ∈[0,π/2]: 已知矩形的中心点(x,y)(x, y)(x,y),旋转角度θ\thetaθ在图中用橙色标注。先来求(x1,y1)(x_1,y_1)(x1​,y1​),用到图中绿色的辅助线,用到的三角形都标注了角θ\thetaθ

weixin_45453121的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Rect(left, top, width, height)的参数详解

aa804738534的博客 4456

python中存储坐标_Python之根据四个坐标确定其位于左上下右上下

1、导入模块import numpy as np2、存储所需要确定位置的四个坐标点#所需要确定位置的四个坐标coordinate = [[2570, 1948], [2391, 1919], [2411, 1792], [2591, 1821]] #常规矩形坐标#coordinate = [[0, 1], [1, 0], [1, 2], [2, 1]] # 非常规(菱形)矩形坐标,用以验证代码...

weixin_39934063的博客 1455

四边形坐标顺时针排序

1. 做图像检测的时候处理数据经常遇到给出四边形的四个坐标点,要求找出左上角坐标并对乱序的坐标按顺时针或者逆时针进行排序,下面是方法,第一个函数只适用于矩形的情况,修改后的函数二适用于任意凸四边形。 from scipy.spatial import distance as dist import numpy as np import math def cos_dist(a, b):

u012604811的博客 7573

poj1151

题意: 求矩形的并面积。 思路:线段树+离散化+扫描线。 代码: #include #include #include #include #include using namespace std; struct node {     int l,r;     node *left,*right;     double len;     int cove

xiefubao的专栏 738

已知Retangle2的中心点坐标,角度,半长,半宽,计算四个顶点坐标和四个线段中点坐标

已知Retangle2的中心点坐标,角度,半长,半宽,计算四个顶点坐标和四个线段中点坐标

Douhaoyu的博客 998

【深度学习标注数据处理】标注标签处理的工具,和坐标转换集锦

数据标注标签处理的工具

钱多多先森 6530

根据倾斜矩形中心点,长宽和倾斜角度,计算顶点,计算两直线交点

已知倾斜矩形中心点center,长w,宽h,倾斜角theta。顶点计算公式为: void getRectVertex(const cv::Point center,float theta,float w,float h,Point& a, Point& b, Point& c, Point& d) { a.x = center.x + w / 2 * cos(theta) - h / 2 * sin(theta); a.y = center.y - w / 2

qq_34176467的博客 3462

根据物体框中心点、宽高及旋转角度确定其顶点

问题引入 最近在进行kitti数据集可视化操作时,遇到一个问题,数据里面告知了物体框中心点的坐标、宽高(w,l)及旋转角度r_y,然后怎么去确定其各个顶点画出一个框来。 问题思考 关于这个问题,可能刚开始想的是既然中心坐标点告知 ,关键角度和长度也知道,很简单可以直接画坐标系,用三角函数求解即可,可当真正去计算时才发现比较复制,而且非常不利于代码的实现。 于是想到关于旋转用极坐标系计算是否更加简单,解决步骤如下: 确定大致思路 在极坐标系中: x=pcos@ 1 y=psin@

qq_47150350的博客 2309

华为oj中级 参数解析

#include<iostream> #include<algorithm> #include<string> #include<vector> #include<unordered_map> #include<fstream> #include<sstream> #include<queue> #include<stack> #include<map> #include<unordered_map

huheqing的博客 558
上一篇: 20230223-基于pyzbar识别条形码并标注示例
下一篇: 20230223-EF6用原生的命令执行SQL命令
Jack_software
博客等级 码龄17年 1324粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_software

感谢打赏,我努力提供优质内容~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值