opencv光流(密集光流+稀疏光流) cv.calcOpticalFlowPyrLK & cv2.calcOpticalFlowFarneback python与c++实现

OpenCV的运动估计算法(cv2.calcOpticalFlowFarneback) 通常, 应将高斯窗口的winsize 设置为更大的值,以实现相同级别的鲁棒性。poly_sigma:与poly_n有对应关系,高斯的标准差,用于平滑用作多项式展开基础的导数。较大的值意味着图像将具有更平滑的表面,从而产生更强大的算法和更模糊的运动场。pyr_scale :指定图像比例 (<1) 的参数,以便为每个图像构建金字塔。较大的值会增加算法对图像噪声的鲁棒性,并可以检测更快速的运动,但会产生更模糊的运动场。flow:与prevImg大小相同,且类型 为CV_32FC2的计算流图像。 阅读详情

密集光流 cv.calcOpticalFlowFarneback()

类型算法相关论文
密集光流Gunnar-Farneback算法Two-Frame Motion Estimation Based on Polynomial Expansion

在这里插入图片描述

官方代码

# 略修改与注释
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(cv.samples.findFile("test.mp4"))
ret, frame1 = cap.read()
prvs = cv.cvtColor(frame1, cv.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[..., 1] = 255
while(1):
    ret, frame2 = cap.read()
    if not ret:
        print('No frames grabbed!')
        break
    next = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY)
    flow = cv.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)# 计算光流(只需要前后帧和一些参数即可)

    mag, ang = cv.cartToPolar(flow[..., 0], flow[..., 1])# 转为极坐标
    # 用hsv矩阵 (480, 640, 3) 保存
    hsv[..., 0] = ang*180/np.pi/2
    hsv[..., 2] = cv.normalize(mag, None, 0, 255, cv.NORM_MINMAX)

    bgr = cv.cvtColor(hsv, cv.COLOR_HSV2BGR)# 转为彩色图像
    cv.imshow("original frame", frame2)
    cv.imshow('optical vis', bgr)
    k = cv.waitKey(30) & 0xff
    # if k == 27:
    #     break
    # elif k == ord('s'):
    #     cv.imwrite('opticalfb.png', frame2)
    #     cv.imwrite('opticalhsv.png', bgr)
    prvs = next
cv.destroyAllWindows()

在这里插入图片描述

可视化的转换

在这里插入图片描述

H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。
纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。
V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。

c++实现


#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/video.hpp>
#include <opencv2/highgui/highgui_c.h>//https://blog.youkuaiyun.com/weixin_44312186/article/details/89000922
using namespace cv;
using namespace std;
int main()
{
	cv::namedWindow("ori", WINDOW_NORMAL);//WINDOW_NORMAL 用户可以改变这个窗口大小
	cv::namedWindow("frame2", WINDOW_NORMAL);



	VideoCapture capture(samples::findFile("C:\\Users\\admin\\Desktop\\flasktest\\train6001.mp4"));//https://docs.opencv.org/4.x/d6/dba/group__core__utils__samples.html#ga3a33b00033b46c698ff6340d95569c13
	if (!capture.isOpened()) {
		//error in opening the video input
		cerr << "Unable to open file!" << endl;
		return 0;
	}
	Mat frame1, prvs;// https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html
	Mat _frame1;
	capture >> _frame1;
	
	cv::resize(_frame1, frame1, cv::Size(640, 480), 0, 0, cv::INTER_AREA);//https://stackoverflow.com/questions/17533101/resize-a-matrix-after-created-it-in-opencv
	

	cvtColor(frame1, prvs, COLOR_BGR2GRAY);
	while (true) {
		Mat frame2, next;
		Mat _frame2;
		capture >> _frame2;
		
		cv::resize(_frame2, frame2, cv::Size(640, 480), 0, 0, cv::INTER_AREA);

		if (frame2.empty())
			break;
		cvtColor(frame2, next, COLOR_BGR2GRAY);
        //计算光流
		Mat flow(prvs.size(), CV_32FC2);
		calcOpticalFlowFarneback(prvs, next, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
		// visualization
		Mat flow_parts[2];
		split(flow, flow_parts);
		Mat magnitude, angle, magn_norm;
		cartToPolar(flow_parts[0], flow_parts[1], magnitude, angle, true);
		normalize(magnitude, magn_norm, 0.0f, 1.0f, NORM_MINMAX);
		angle *= ((1.f / 360.f) * (180.f / 255.f));
		
		//build hsv image
		Mat _hsv[3], hsv, hsv8, bgr;
		_hsv[0] = angle;
		_hsv[1] = Mat::ones(angle.size(), CV_32F);
		_hsv[2] = magn_norm;
		merge(_hsv, 3, hsv);
		hsv.convertTo(hsv8, CV_8U, 255.0);
		cvtColor(hsv8, bgr, COLOR_HSV2BGR);
		imshow("frame2", bgr);
		imshow("ori", next);
		int keyboard = waitKey(30);
		if (keyboard == 'q' || keyboard == 27)
			break;
		prvs = next;
	}
}

稀疏光流 cv.calcOpticalFlowPyrLK()

类型算法相关论文
稀疏光流Lucas Kanade(LK)算法An iterative image registration technique with an application to stereo vision+Generalized Image Matching by the Method of Differences

官方代码

# 略修改与注释
import numpy as np
import cv2 as cv
import argparse

parser = argparse.ArgumentParser(description='This sample demonstrates Lucas-Kanade Optical Flow calculation. \
                                              The example file can be downloaded from: \
                                              https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4')
# parser.add_argument('image', type=str, help='path to image file')
parser.add_argument('--image', type=str,default='test.mp4', help='path to image file')
args = parser.parse_args()

cap = cv.VideoCapture(args.image)

# params for ShiTomasi corner detection
feature_params = dict( maxCorners = 100,
                       qualityLevel = 0.3,
                       minDistance = 7,
                       blockSize = 7 )

# Parameters for lucas kanade optical flow
lk_params = dict( winSize  = (15, 15),
                  maxLevel = 2,
                  criteria = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))

# Create some random colors
color = np.random.randint(0, 255, (100, 3))

# Take first frame and find corners in it
ret, old_frame = cap.read()
old_gray = cv.cvtColor(old_frame, cv.COLOR_BGR2GRAY)
p0 = cv.goodFeaturesToTrack(old_gray, mask = None, **feature_params)

# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)

while(1):
    ret, frame = cap.read()
    if not ret:
        print('No frames grabbed!')
        break

    frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    # calculate optical flow
    p1, st, err = cv.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)

    # Select good points
    if p1 is not None:
        good_new = p1[st==1]
        good_old = p0[st==1]

    # draw the tracks
    for i, (new, old) in enumerate(zip(good_new, good_old)):
        a, b = new.ravel()
        c, d = old.ravel()
        mask = cv.line(mask, (int(a), int(b)), (int(c), int(d)), color[i].tolist(), 2)
        frame = cv.circle(frame, (int(a), int(b)), 5, color[i].tolist(), -1)
    img = cv.add(frame, mask)

    cv.imshow('frame', img)
    k = cv.waitKey(30) & 0xff
    if k == 27:
        break

    # Now update the previous frame and previous points
    old_gray = frame_gray.copy()
    p0 = good_new.reshape(-1, 1, 2)

cv.destroyAllWindows()

参考与更多

官方介绍

OpenCV进阶(2)OpenCV中的光流 在这篇文章中,我们将学习在视频或帧序列中计算光流的各种算法。我们将讨论稀疏和密集光流算法的相关理论和在OpenCV中的实现。 1.什么是光流? 光流是一个视频中两个连续帧之间的逐像素运动估计任务。基本上,光流任务意味着计算像素的移动向量作为物体在两个相邻图像之间的位移差。光流的主要思想是估计物体运动或摄像机运动引起的物体的位移矢量。 2.理论基础 让我们假设我们有一个灰度图像。我们定义函数I(x,y,t)I(x,y,t)I(x,y,t),其中x,y为像素坐标,t为帧数。函数I(x,y,t)I(x,y,t) 阅读详情

相关推荐

【OpenCV函数详解之cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)】

cv2.calcOpticalFlowPyrLK() 是 OpenCV 库中用于计算两幅图像之间稀疏光流(Sparse Optical Flow)的方法之一。光流是指图像中物体在不同时间点的位置移动。这个函数通过 Lucas-Kanade 方法来跟踪图像中的关键点(feature points)在后续帧中的位置。需要传入前一帧和当前图像以及前一帧检测到的角点,用于获得光流检测后的角点位置。

2301_77444219的博客 3611

光流Optical Flow介绍与OpenCV实现

**光流(Optical Flow)**是什么呢?名字很专业,感觉很陌生,但本质上,我们是最熟悉不过的了。因为这种视觉现象我们每天都在经历。从本质上说,光流就是你在这个运动着的世界里感觉到的明显的视觉运动(呵呵,相对论,没有绝对的静止,也没有绝对的运动)。例如,当你坐在火车上,然后往窗外看。你可以看到树、地面、建筑等等,他们都在往后退。这个运动就是光流。而且,我们都会发现,他们的运动速度居然不一样?

点滴积累 1726

3D Slicer中Auto3DSeg和TotalSegmentator等自动分割插件总是安装失败,怎么办?教你两招

TotalSegmentator, MONAI auto3Dseg,这些工具因分割器官多,准确性高,备受关注。同时,这些自动分割工具被集成在了3D slicer平台,非常方便临床医生做手术规划。详细了解这些工具看之前的教程👇-------- 简单概述 --------其中,MONAIAuto3DSeg扩展附带数十种针对特定临床用例的预训练分割模型,这些模型旨在快速运行,几分钟内即可在任何普通计算机上运行,无需 GPU,甚至在笔记本电脑上。

zzjlhlcd的博客 1696

OpenCV3学习(12.1) 稠密光流calcOpticalFlowFarneback

简介         光流(optic flow)是什么呢?名字很专业,感觉很陌生,但本质上,我们是最熟悉不过的了。因为这种视觉现象我们每天都在经历。从本质上说,光流就是你在这个运动着的世界里感觉到的明显的视觉运动(呵呵,相对论,没有绝对的静止,也没有绝对的运动)。例如,当你坐在火车上,然后往窗外看。你可以看到树、地面、建筑等等,他们都在往后退。这个运动就是光流。而且,我们都会发现,他们的运动速...

知识搬运工的博客 1万+

数据结构实验1.2—高精度计算PI值(西工大)

这是数据结构第二题的题目,是让我们根据用户的需求来计算派的值 这是题目的详细描述,刚看到这道题的时候,我是真的头大,完全没有思路,于是查找了一些大佬的笔记后才开始编写 这是我在写这些代码是所运用到的数学反三角函数幂次展开式的知识。 下面是正确的代码以及我的一些见解,和需要注意的一些地方。希望能对你有所帮助。如有更加精简的算法,请在评论区留下你的算法!!!谢谢!!! #define _CRT_SECURE_NO_WARNINGS #include&lt;stdio.h&gt; #include&lt;stdl

abcdef0623的博客 5831

LabVIEW 调用MATLAB 进行图像处理的实现

程机械及设备的变形、振动、冲击、粗糙度、刚度和强度等特性,还可用在土木结构、水利设施的变形测量[4][5]。因此,该技术在机械、土木、水利、电器、航空航天、兵器工业及生物医学等领域的检测中具有非常重要的地位。将物面前方空间的散斑用摄像设备记录下来,当物体运动或由于受力而变形时,这些随机分布的散斑图也随之在空间按一定的规律运动,因此能用记录的散斑图在计算机上分析物体的运动和变形,这就是电子散斑技术。当物体的漫反射表面被激光照射时,漫反射的光波在物体表面的前方相互干涉,由于漫反射光的。

qq_37971227的博客 3873

【学习OpenCV】OpenCV中CalcOpticalFlowFarneback()函数分析

OpenCV中CalcOpticalFlowFarneback函数函数简介CalcOpticalFlowFarneback()函数是利用用Gunnar Farneback的算法计算全局性的稠密光流算法(即图像上所有像素点的光流都计算出来),由于要计算图像上所有点的光流,故计算耗时,速度慢。它的核心思想主要源于”Two-Frame Motion Estimation Based on Polynom...

开源节流 4909

手把手教你学Simulink--双足机器人分数阶PID控制仿真

分数阶PID(Fractional-order PID, FOPID)控制是一种先进的控制策略,它扩展了传统的整数阶PID控制器的概念。FOPID控制器允许积分和微分项的阶次不是严格的整数,而是可以是任意实数,这为系统提供了更多的设计自由度,并可能带来更好的性能。在双足机器人控制中,分数阶PID控制可以用于改善机器人的平衡控制、轨迹跟踪等任务的性能。下面我们将详细介绍如何使用Simulink进行基于分数阶PID控制方法的双足机器人仿真研究。

MHD0815的博客 879

【OpenCV-Python】教程:5-3 光流

所以从用户的角度来看,想法很简单,我们给一些点来跟踪,我们得到了这些点的光流矢量,但还是有一些问题,例如大的运动就失效了,为了解决这个问题,我们使用金字塔,当金字塔在上升时,小的运动被移除了,大的运动变成了小的运动,所以通过运用 Lucas-Kanade, 我们得到了光流。光流是由物体或相机的运动引起的图像物体在两个连续帧之间的表观运动模式。是不知道的,一个方程不能求解两个未知参数,所以,有很多方法来求解该问题,例如其中的 Lucas-Kanade 方法。块,所以,9个点的运动方向相同,可以求出9个点的。

1999

机器学习实战1-四种算法对比对客户信用卡还款情况进行预测与模型评估

大家好,我是微学AI,今天给大家带来一个机器学习实战案例:利用机器学习的四种算法对比对客户信用卡还款情况进行分类。信用卡又叫贷记卡,是由商业银行或信用卡公司对信用合格的消费者发行的信用证明。现在的年轻人,特别是80后,90后甚至00后到喜欢超前消费,每个人名下多多少少都有至少一张信用卡,有些人由于过度超前消费,导致下个月无法还款导致的逾期,这样会对个人征信产生影响,今天我们就来分析分析具有哪些特性的人会有信用卡逾期的可能。

微学AI的博客 4710

作物生长模型Oryza V3实战1:为什么要研究它

ORYZAV3是水稻生长模拟模型ORYZA2000的最新升级版本(3.5版),作为作物生长模型,它通过数学方法和计算机技术模拟水稻生长发育过程及其与环境条件的相互作用。主要功能包括:模拟不同条件下的水稻生长和产量形成、评估环境胁迫影响、分析土壤碳氮动态以及进行区域尺度模拟。国内应用广泛,科研机构用于气候变化影响评估、灌溉模式比较等研究,并开展参数敏感性分析和应用培训。使用流程分为六个步骤:确定输入参数(气象、土壤、作物三类)、参数校准、设置模拟环境、运行模型、分析结果(输出50个参数)和计算产量(穗干重×收

504

使用Python和OpenCV中的calcOpticalFlowFarneback函数提取稠密光流并进行映射(warp)

介绍 OpenCV中自带两个提取光流的函数: cv2.calcOpticalFlowPyrLK() cv2.calcOpticalFlowFarneback() 其中calcOpticalFlowPyrLK函数是提取稀疏光流的函数,而本文主要关注calcOpticalFlowFarneback函数,并将它应用在一个真实的问题中 具体的原理介绍可以参考知乎博客光流估计——从传统方法到深度学习 真实问题是: 给定两张图像,一张是带形变矫正的图像(unwraped_img.png),一张是参照图像(referen

renwu 7927

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

XiaoqiangClub的博客 5161

OpenCV42:光流|Optical Flow

目标 在本章中,将学习: 使用 Lucas-Kanade 方法理解光流的概念及其估计 使用cv2.calcOpticalFlowPyrLK()等函数来跟踪视频中的特征点 使用cv2.calcOpticalFlowFarneback()方法创建一个密集的光流场 光流 光流是由物体或相机的运动引起的图像物体在两个连续帧之间的明显运动的模式。它是二维向量场,其中每个向量都是一个位移向量,显示点从第一帧到第二帧的移动。如下图所示。 它显示了一个球在连续 5 帧中移动。箭头表示其位移矢量。光流在以下领域有许多应

uncle_ll的博客 1734

WPF数据绑定Binding对数据的转换与效验(四)

Binding的作用就是架在Source与Target之间的桥梁,数据可以在这座桥梁的帮助下来流通。就像现实世界中的桥梁会设置一些关卡进行安检一样,Binding这座桥上也可以设置关卡对数据的有效性进行检验,不仅如此,当Binding的两端要求使用不同的数据类型时,我们还可以为数据设置转换器。Binding用于数据有效性检验的关卡是它的ValidationRules属性,用于数据类型转换的关卡是它的Converter属性。

qq_30725967的博客 1626

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【OpenCV】计算视频的光流并跟踪物体calcOpticalFlowPyrLK

计算光流可以使用OpenCV的calcOpticalFlowPyrLK方法,cv2.calcOpticalFlowPyrLK是OpenCV库中的一个函数,用于计算稀疏光流。它实现的是Lucas-Kanade方法,这是一种常用的光流计算方法。 光流是图像中物体运动的近似表示,它描述了图像中每个像素点在连续两帧之间的移动。Lucas-Kanade方法假设图像中的一个小邻域内的所有像素在运动上是一致的(即具有相同的光流)。

xian0710830114的专栏 4288

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Opencv学习(4)——CalcOpticalFlowPyrLK()函数解析

opencv官网:https://docs.opencv.org/3.4.6/dc/d6b/group__video__track.html#ga473e4b886d0bcc6b65831eb88ed93323 void cv::calcOpticalFlowPyrLK ( InputArray prevImg, InputArray nextImg, InputArray prevPts,...

xiaohu的博客 3万+

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

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

光流 python-opencv

cv2.calcOpticalFlowFarneback()函数是opencv中使用Gunnar Farneback算法计算稠密光流(每个像素的光流都要计算)的pyhton实现。相关论文为 《Two-Frame Motion Estimation Based on PolynomialExpansion》 ,Gunnar Farneback算法基于图像梯度恒定假设和局部光流恒定假设。 调用格式: flow = cv2.calcOpticalFlowFarneback(prevImg, nextImg,

qq_40185847的博客 681

OpenCV 光流法总结

OpenCV光流法总结

scott198512的博客 3963

cv::calcOpticalFlowPyrLK函数

简介 void cv::calcOpticalFlowPyrLK ( InputArray prevImg,以该图片为基准流追踪 InputArray nextImg,用来获得追踪结果的图片 InputArray prevPts,以该数组点为基准就行流追踪,单位单精度浮点数 InputOutputArray nextPts, 获得追踪点的结果 OutputArray status, 输出状态标记,如果追踪到了结果,则对应同角标的状态向量位置元素为1,否则为0 OutputArray err,输

weixin_39068873的博客 3787

关于光流法cv::calcOpticalFlowPyrLK的学习使用记录-参数的分析以及方法使用的思考

网上有很多opencvcvcalcOpticalFlowPyrLK的使用方法介绍,但是除了直接的翻译,还有官网的链接,具体的参数使用分析还是不够全面,真正使用过程中发现还有问题。我在这里做了一些简单总结,希望对大家有帮助。基本上就这些了,大家理性参考,欢迎讨论。代码没做优化,就是提供一个思路。...

u011826081的博客 5519

光流(Optical Flow)算法原理详见以及cv::calcOpticalFlowFarneback和cv::calcOpticalFlowPyrLK参数说明

方法特点优点缺点局部窗口法,线性方程组快速,适用于稀疏光流靠角点稀疏性,易受遮挡干扰全局最小化,带平滑项稠密估计效果好迭代复杂,慢Farneback多项式逼近+金字塔密集光流,性能稳定较慢深度学习方法精度高,适应复杂变形需 GPU,模型大。

qq_36812406的博客 2204

Opencv 光流法解析calcOpticalFlowPyrLK

KLT 什么是光流以及如何求解光流(利用最小二乘法求解)locateROI adjustROIpyrUp pyrDownOpencv 光流法解析 参数设置: MaxLevel = 3 //默认建立0-3层金字塔,0层是最底层(原图),3层是最高层 withDerivatives = false //就是是否在计算金字塔的时候 同时计算 图像梯度(差分),默认为false, 如果改为true,代码好像有一点点bug?下面的程序从opencv中摘录出来,可以直接运行调试打印输出,方便理解calcOptica

tony365的博客 2231

运动跟踪(一):calcOpticalFlowFarneback(),稠密光流法

关于金字塔LK光流的Demo已经在上一篇的blog中说明了,地址:https://blog.csdn.net/liangchunjiang/article/details/79869830测试OpenCV的函数calcOpticalFlowFarneback()的效果void cv::calcOpticalFlowFarneback( InputArray _prev0, InputArray _...

liangchunjiang的博客 4793

OpenCV中CalcOpticalFlowFarneback()函数分析

OpenCV中CalcOpticalFlowFarneback函数 函数简介CalcOpticalFlowFarneback()函数是利用用Gunnar Farneback的算法计算全局性的稠密光流算法(即图像上所有像素点的光流都计算出来),由于要计算图像上所有点的光流,故计算耗时,速度慢。它的核心思想主要源于”Two-Frame Motion Estimation Based on Polynom

没有最好,只有更好! 2万+

【python】OpenCV—Optical Flow

这种算法试图通过考虑图像中的局部特征和区域来更准确地估计光流,即使在图像中存在噪声、遮挡或运动不连续的情况下也能表现出较好的性能。这个函数结合了稀疏特征匹配和光流算法的优点,通过先找到一组稀疏的关键点(如使用Shi-Tomasi角点检测器),然后利用这些稀疏点来估计整个图像的光流场。光流(Optical Flow)是计算机视觉和图像处理中的一个重要概念,它描述了连续帧图像中像素点随时间的运动轨迹和速度的二维矢量场。密集光流:计算图像中每个像素点的光流,从而得到整个图像的光流场。

bryant_meng 4835
上一篇: cpp summary c++语法总结
下一篇: opencv c++ Mat CUDA的编译与使用
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值