opencv_day18

#使用函数cv2.pointPolygonTest()判断点与轮廓的关系
import cv2
#----------------------原始图像-------------------
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
#---------------------获取凸包--------------------
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
hull=cv2.convexHull(contours[3])
image=cv2.cvtColor(binary,cv2.COLOR_GRAY2BGR)
cv2.polylines(image,[hull],True,(0,255,0),2)
#------------------内部点A与轮廓的关系-------------------
distA=cv2.pointPolygonTest(hull,(105,300),False)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,'A',(105,300),font,1,(0,255,0),3)
print('distA=',distA)
#------------------外部B与轮廓的关系-------------------
distB=cv2.pointPolygonTest(hull,(50,300),False)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,'B',(50,300),font,1,(0,255,0),3)
print('distB=',distB)
#------------------边缘线上的点C与轮廓的关系-------------------
distC=cv2.pointPolygonTest(hull,(84,300),False)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,'C',(84,300),font,1,(0,255,0),3)
print('distC=',distC)#测试边缘到底在哪里,然后再使用确定位置的点绘制文字
#----------------显示----------------------------
cv2.imshow('result',image)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#使用函数cv2.pointPolygonTest()判断点与轮廓的关系
import cv2
#----------------------原始图像-------------------
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
#---------------------获取凸包--------------------
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
hull=cv2.convexHull(contours[3])
image=cv2.cvtColor(binary,cv2.COLOR_GRAY2BGR)
cv2.polylines(image,[hull],True,(0,255,0),2)
#------------------内部点A与轮廓的关系-------------------
distA=cv2.pointPolygonTest(hull,(105,300),False)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,'A',(105,300),font,1,(0,255,0),3)
print('distA=',distA)
#------------------外部B与轮廓的关系-------------------
distB=cv2.pointPolygonTest(hull,(50,300),False)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,'B',(50,300),font,1,(0,255,0),3)
print('distB=',distB)
#------------------边缘线上的点C与轮廓的关系-------------------
distC=cv2.pointPolygonTest(hull,(84,300),False)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,'C',(84,300),font,1,(0,255,0),3)
print('distC=',distC)#测试边缘到底在哪里,然后再使用确定位置的点绘制文字
#----------------显示----------------------------
cv2.imshow('result',image)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#使用函数cv2.createShapeContextDistanceExtractor()计算形状场景距离
import cv2
#---------------------原始图像img1的边缘----------------------
img1=cv2.imread('./image/2.jpg')
cv2.imshow('original1',img1)
gray1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
ret,binary1=cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
contours1,hierarchy1=cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt1=contours1[0]
#---------------------原始图像img2的边缘----------------------
img2=cv2.imread('./image/xintaixue.png')
cv2.imshow('original2',img2)
gray2=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret,binary2=cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
contours2,hierarchy2=cv2.findContours(binary2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt2=contours2[0]
#------------------------构造距离提取算子---------------------
sd=cv2.createShapeContextDistanceExtractor()
#--------------------------计算距离---------------------
d1=sd.computeDistance(cnt1,cnt1)
print('显示与自身的距离d1=',d1)
d2=sd.computeDistance(cnt2,cnt1)
print('显示两幅图像的距离d2=',d2)
#------------------------显示距离---------------------
cv2.waitKey()
cv2.destroyAllWindows()

输出:
显示与自身的距离d1= 0.0
显示两幅图像的距离d2= 0.19770106673240662
在这里插入图片描述

#计算Hausdorff距离
#H(A,B)=max(h(A,B),h(B,A)),其中h(A,B)=max min||a-b||(a属于A,b属于B)
#使用函数cv2.createHausdorffDistanceExtractor()计算不同图像的Hausdorff距离
import cv2
#---------------------------读取原始图像--------------------
img1=cv2.imread('./image/2.jpg')
img2=cv2.imread('./image/ym.jpeg')
cv2.imshow('original1',img1)
cv2.imshow('original2',img2)
#------------------------色彩转换-----------------------
gray1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
#-----------------------阈值处理------------------------
ret,binary1=cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
ret,binary2=cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
#-----------------------提取轮廓------------------------
contours1,hierarchy=cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
contours2,hierarchy=cv2.findContours(binary2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt1=contours1[0]
cnt2=contours2[0]
#--------------------构造距离提取算子-----------------------
hd=cv2.createHausdorffDistanceExtractor()
#--------------------计算距离--------------------------
d1=hd.computeDistance(cnt1,cnt1)
print('与自身图像的距离d1=',d1)
d2=hd.computeDistance(cnt1,cnt2)
print('与不相似的图像的距离d2=',d2)
#----------------------显示距离-----------------------
cv2.waitKey()
cv2.destroyAllWindows()

输出:
与自身图像的距离d1= 0.0
与不相似的图像的距离d2= 331.69866943359375

说明:相似图像不好找,所以没有列举,其值应该比与不相似的要小

在这里插入图片描述

#轮廓的特征值
#计算轮廓的宽高比
import cv2
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h=cv2.boundingRect(contours[3])
cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),3)
aspectRatio=float(w)/h
print(aspectRatio)
cv2.imshow('result',img)
cv2.waitKey()
cv2.destroyAllWindows()``

输出:
1.0307692307692307

![在这里插入图片描述](https://img-blog.csdnimg.cn/20191027145206327.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1OTY2NDc4,size_16,color_FFFFFF,t_70)


```python
#extent=轮廓面积(对象面积)/矩形边界面积
import cv2
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h=cv2.boundingRect(contours[3])
cv2.drawContours(img,contours[3],-1,(0,0,255),3)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),3)
rectArea=w*h
cntArea=cv2.contourArea(contours[3])
extend=float(cntArea)/rectArea
print(extend)
cv2.imshow('result',img)
cv2.waitKey()
cv2.destroyAllWindows()

输出;
0.48369690011481054
在这里插入图片描述

#Solidity=轮廓面积(对象面积)/凸包面积
import cv2
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
contoursArea=cv2.contourArea(contours[3])
cv2.drawContours(img,contours[3],-1,(0,0,255),2)
hull=cv2.convexHull(contours[3])
hullArea=cv2.contourArea(hull)
cv2.drawContours(img,[hull],-1,(255,0,0),2)
solidity=(float)(contoursArea)/hullArea
print(solidity)
cv2.imshow('result',img)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
0.6870515329419439
在这里插入图片描述

#等效直径,可以用等效直径来衡量轮廓的特征值
#等效直径=sqrt(4*轮廓面积/pi)
#计算与轮廓面积相等的圆形的直径,并绘制与该轮廓等面积的圆
import cv2
import numpy as np
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,contours[3],-1,(0,0,255),2)
cntArea=cv2.contourArea(contours[3])
equiDiameter=np.sqrt(4*cntArea/np.pi)
print(equiDiameter)
cv2.circle(img,(100,100),int(equiDiameter/2),(0,0,255),3)#展示等直径大小的圆
cv2.imshow('result',img)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
51.78879319876666
在这里插入图片描述

#方向
#编写程序,观察函数cv2.fitEllipse()的不同返回值
import cv2
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
ellipse=cv2.fitEllipse(contours[3])
retval=cv2.fitEllipse(contours[3])
print('单个返回值形式:')
print('retval=',retval)
(x,y),(MA,ma),angle=cv2.fitEllipse(contours[3])
print('三个返回值形式:')
print('(x,y)=(',x,y,')')
print('MA,ma=(',MA,ma,')')
print('angle=',angle)
cv2.ellipse(img,ellipse,(0,0,255),2)
cv2.imshow('result',img)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述
单个返回值形式:
retval= ((118.71305847167969, 295.62164306640625), (59.76806640625, 62.01142883300781), 60.039405822753906)
三个返回值形式:
(x,y)=( 118.71305847167969 295.62164306640625 )
MA,ma=( 59.76806640625 62.01142883300781 )
angle= 60.039405822753906

#掩膜与像素点
#使用Numpy函数获取一个数组内非零值元素的位置信息
import numpy as np
#------------生成一个元素都是0的数组a----------------------------
a=np.zeros((5,5),dtype=np.uint8)
#-----------随机将其中10个位置上的值设置为1--------------------
#-------times控制次数
#-------i,j是随机生成的行,列位置
#-------a[i,j]=1,将随机挑选出来的位置上的值设置为1
for items in range(10):
    i=np.random.randint(0,5)
    j=np.random.randint(0,5)
    a[i,j]=1
#------------打印数组a,观察数组内a值的情况-----------------
print('a=\n',a)
#------------查找数组a内非零值的位置信息---------------
loc=np.transpose(np.nonzero(a))
#-----------输出数组a内非零元素的位置信息-----------------
print('a内非零元素的信息:\n',loc)

输出:
a=
[[0 1 0 0 1]
[1 1 0 0 0]
[1 0 0 1 0]
[1 0 1 0 0]
[0 0 0 1 1]]
a内非零元素的信息:
[[0 1]
[0 4]
[1 0]
[1 1]
[2 0]
[2 3]
[3 0]
[3 2]
[4 3]
[4 4]]

#使用Numpy来获取一个图像内的轮廓点位置
import cv2
import numpy as np
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
#------------获取轮廓--------------
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[3]
#----------绘制空心轮廓-------------
mask1=np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask1,[cnt],0,255,2)
pixelpoints1=np.transpose(np.nonzero(mask1))
print('pixelpoints1.shape=',pixelpoints1.shape)
print('pixelpoints1',pixelpoints1)
cv2.imshow('mask1',mask1)
#----------绘制实心轮廓-------------
mask2=np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask2,[cnt],0,255,-1)
pixelpoints2=np.transpose(np.nonzero(mask2))
print('pixelpoints2.shape=',pixelpoints2.shape)
print('pixelpoints2',pixelpoints2)
cv2.imshow('mask2',mask2)
#-------------释放窗口----------------
cv2.waitKey()
cv2.destroyAllWindows()

输出:
pixelpoints1.shape= (1004, 2)
pixelpoints1 [[266 95]
[266 96]
[266 97]

[332 132]
[332 133]
[332 134]]
pixelpoints2.shape= (2242, 2)
pixelpoints2 [[267 96]
[267 97]
[267 98]

[331 132]
[331 133]
[331 134]]
在这里插入图片描述

#使用opencv函数cv2.findNonZero()获取一个数组内的非零值
import cv2
import numpy as np
#------------生成一个元素都是0的数组a----------------------------
a=np.zeros((5,5),dtype=np.uint8)
#-----------随机将其中10个位置上的值设置为1--------------------
#-------times控制次数
#-------i,j是随机生成的行,列位置
#-------a[i,j]=1,将随机挑选出来的位置上的值设置为1
for items in range(10):
    i=np.random.randint(0,5)
    j=np.random.randint(0,5)
    a[i,j]=1
#------------打印数组a,观察数组内a值的情况-----------------
print('a=\n',a)
#------------查找数组a内非零值的位置信息---------------
loc=cv2.findNonZero(a)
#-----------输出数组a内非零元素的位置信息-----------------
print('a内非零元素的信息:\n',loc)

输出:
a=
[[0 1 0 0 0]
[0 0 0 1 1]
[1 1 0 0 0]
[0 1 0 0 0]
[0 0 0 0 1]]
a内非零元素的信息:
[[[1 0]]

[[3 1]]

[[4 1]]

[[0 2]]

[[1 2]]

[[1 3]]

[[4 4]]]

#使用opencv函数cv2.findNonZero()获取一个图像内的轮廓点的位置
import cv2
import numpy as np
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
#------------获取轮廓--------------
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[3]
#----------绘制空心轮廓-------------
mask1=np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask1,[cnt],0,255,2)
pixelpoints1=cv2.findNonZero(mask1)
print('pixelpoints1.shape=',pixelpoints1.shape)
print('pixelpoints1',pixelpoints1)
cv2.imshow('mask1',mask1)
#----------绘制实心轮廓-------------
mask2=np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask2,[cnt],0,255,-1)
pixelpoints2=cv2.findNonZero(mask2)
print('pixelpoints2.shape=',pixelpoints2.shape)
print('pixelpoints2',pixelpoints2)
cv2.imshow('mask2',mask2)
#-------------释放窗口----------------
cv2.waitKey()
cv2.destroyAllWindows()

输出;
pixelpoints1.shape= (1004, 1, 2)
pixelpoints1 [[[ 95 266]]

[[ 96 266]]

[[ 97 266]]

[[132 332]]

[[133 332]]

[[134 332]]]
pixelpoints2.shape= (2242, 1, 2)
pixelpoints2 [[[ 96 267]]

[[ 97 267]]

[[ 98 267]]

[[132 331]]

[[133 331]]

[[134 331]]]

在这里插入图片描述

#最大值,最小值以及它们的位置
import cv2
import numpy as np
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
#------------获取轮廓--------------
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[3]
#-----------使用掩膜获取感兴趣区域的最值位置--------------
#需要注意函数minMaxLoc处理的对象为灰度图像,本例中处理的对象为灰度图像gray
#如果希望获取彩色图像的最值,需要提取各个通道图像,为每个通道单独计算最值
mask=np.zeros(gray.shape,np.uint8)
mask=cv2.drawContours(mask,[cnt],-1,255,-1)
minVal,maxVal,minLoc,maxLoc=cv2.minMaxLoc(gray,mask=mask)
print('minVal=',minVal)
print('maxVal=',maxVal)
print('minLoc=',minLoc)
print('maxLoc=',maxLoc)
#----------------使用掩膜获取感兴趣区域并显示------------------
masko=np.zeros(img.shape,np.uint8)
masko=cv2.drawContours(masko,[cnt],-1,(255,255,255),-1)
loc=cv2.bitwise_and(img,masko)
cv2.imshow('mask',loc)
#显示灰度结果
#loc=cv2.bitwise_and(gray,mask)
#cv2.imshow('mask',loc)
#--------------释放窗口-----------
cv2.waitKey()
cv2.destroyAllWindows()

输出:
minVal= 128.0
maxVal= 255.0
minLoc= (96, 267)
maxLoc= (101, 268)
在这里插入图片描述

#平均颜色及平均灰度
#cv2.mean(),mean_val=cv2.mean(im,mask=mask)
#使用函数cv2.mean()计算一个对象的平均灰度
import cv2
import numpy as np
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
#------------获取轮廓--------------
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[3]
#--------------使用掩模获取感兴趣区域的均值----------------
mask=np.zeros(gray.shape,np.uint8)#构造mean所使用的掩模(必须是单通道的)
cv2.drawContours(mask,[cnt],0,(255,255,255),-1)
meanVal=cv2.mean(img,mask=mask)#mask是一个区域,必须是单通道的
print('meanVal=\n',meanVal)
#-----------使用掩模获取感兴趣区域并显示-------------------------
masko=np.zeros(img.shape,np.uint8)
cv2.drawContours(masko,[cnt],-1,(255,255,255),-1)
loc=cv2.bitwise_and(img,masko)
cv2.imshow('mask',loc)
#-----------释放窗口--------------
cv2.waitKey()
cv2.destroyWindow()
#平均颜色及平均灰度
#cv2.mean(),mean_val=cv2.mean(im,mask=mask)
#使用函数cv2.mean()计算一个对象的平均灰度
import cv2
import numpy as np
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
#------------获取轮廓--------------
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[3]
#--------------使用掩模获取感兴趣区域的均值----------------
mask=np.zeros(gray.shape,np.uint8)#构造mean所使用的掩模(必须是单通道的)
cv2.drawContours(mask,[cnt],0,(255,255,255),-1)
meanVal=cv2.mean(img,mask=mask)#mask是一个区域,必须是单通道的
print('meanVal=\n',meanVal)
#-----------使用掩模获取感兴趣区域并显示-------------------------
masko=np.zeros(img.shape,np.uint8)
cv2.drawContours(masko,[cnt],-1,(255,255,255),-1)
loc=cv2.bitwise_and(img,masko)
cv2.imshow('mask',loc)
#-----------释放窗口--------------
cv2.waitKey()
cv2.destroyWindow()

输出:
meanVal=
(245.60481712756467, 245.60481712756467, 245.60481712756467, 0.0)
在这里插入图片描述

#极点
import cv2
import numpy as np
img=cv2.imread('./image/2.jpg')
cv2.imshow('original',img)
#------------获取轮廓--------------
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[3]
mask=np.zeros(gray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,(255,0,0),-1)
#------------计算极值--------------
leftmost=tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost=tuple(cnt[cnt[:,:,0].argmax()][0])
topmost=tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost=tuple(cnt[cnt[:,:,1].argmax()][0])
#------------打印极值-------------
print('leftmost=',leftmost)
print('rightmost=',rightmost)
print('topmost=',topmost)
print('bottommost=',bottommost)
#---------------绘制说明文字----------
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'A',leftmost,font,1,(0,0,255),2)
cv2.putText(img,'B',rightmost,font,1,(0,0,255),2)
cv2.putText(img,'C',topmost,font,1,(0,0,255),2)
cv2.putText(img,'D',bottommost,font,1,(0,0,255),2)
#------------绘制图像---------------
cv2.imshow('result',img)
#-------------------释放窗口-----------------
cv2.waitKey()
cv2.destroyWindow()

输出:
在这里插入图片描述

leftmost= (83, 303)
rightmost= (149, 274)
topmost= (96, 267)
bottommost= (128, 331)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值