Python?OpenCV實(shí)現(xiàn)圖形檢測(cè)示例詳解
圖形檢測(cè)在計(jì)算機(jī)視覺開發(fā)中是一項(xiàng)非常重要的操作,算法通過對(duì)圖像的檢測(cè),分析出圖像中可能存在哪些形狀。除此之外,除了讓計(jì)算機(jī)識(shí)別輪廓之外,輪廓也需要讓人看到,這就需要再分別讀這些輪廓的形狀進(jìn)行描繪。
1. 輪廓識(shí)別與描繪
cv2.findContours() & cv2.drawContours() 方法
在Python中OpenCV提供了findContours() 方法來(lái)判斷圖像的輪廓,drawContours()方法來(lái)繪制輪廓。
1.1 cv2.findComtours()方法
cv2.findComtours()方法的語(yǔ)法如下
cv2.contours, hierarchy = findContours(image, mode, method)
其中
- image 即原圖像
- mode 輪廓檢索模式,具體參數(shù)被總結(jié)在了下表中
- method 使用的方法,具體參數(shù)也被總結(jié)在了下表中
contours是一個(gè)列表,列表的每一個(gè)元素都是由某個(gè)輪廓的像素的坐標(biāo)組成的數(shù)組。
hierarchy是輪廓與輪廓之間的層次關(guān)系。
mode取值表
mode值 | 描述 |
---|---|
cv2.RETR_EXTERNAL | 只檢測(cè)外輪廓 |
cv2.RETR_LIST | 檢測(cè)所有輪廓,但不建立層次關(guān)系 |
cv2.RETR_CCOMP | 檢測(cè)所有輪廓,并建立兩級(jí)層次關(guān)系 |
cv2.RETR_TREE | 建立所有輪廓,并建立樹狀結(jié)構(gòu)的層次關(guān)系 |
method取值表
cv2.PATH_APPROX_ | 儲(chǔ)存輪廓上所有點(diǎn) |
---|---|
cv2.PATH_APPROX_NONE | 只保存水平、垂直或?qū)蔷€輪廓的端點(diǎn) |
cv2.PATH_APPROX_SIMPLE | Ten-Chinl |
cv2.PATH_APPROX_TC89_L1 | Ten-Chinl近似算法的一種 |
cv2.PATH_APPROX_TC89_KCOS | Ten-Chinl近似算法的一種 |
1.2 cv2.drawContours() 方法
cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
- image 目標(biāo)圖像
- contours findComtours()方法得到的輪廓列表
- contourldx 輪廓中列表中,繪制輪廓的對(duì)象的索引,如果為-1則表示繪制所有
- color 繪制線條時(shí)的顏色,使用BGR格式描述
- thickness 線條粗細(xì)程度,-1表示實(shí)心
- lineType 繪制輪廓時(shí)線條的類型(可選參數(shù))
- hierarchy findComtours()方法得到的層次關(guān)系(可選參數(shù))
- maxLevel 繪制輪廓的層次深度,最深繪制在maxLevel層。(可選參數(shù))
- offset 偏移量 (可選參數(shù))
drawContours() 方法返回的是一個(gè)圖像(數(shù)組)。
1.3 代碼示例
以隊(duì)此小鳥圖操作為例(test1.jpg):
import cv2 img = cv2.imread("test1.jpg") # 彩色圖像轉(zhuǎn)為變成單通道灰度圖像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化處理 t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 檢測(cè)圖像中出現(xiàn)的所有輪廓,記錄輪廓的每一個(gè)點(diǎn) contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 繪制所有輪廓,寬度為5,顏色為紅色 cv2.drawContours(img, contours, -1, (0, 0, 255), 5) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
程序執(zhí)行結(jié)果展示如下,圖中所有能夠識(shí)別出的輪廓被描出:
2. 輪廓擬合
輪廓擬合,即,將凹凸不平的輪廓用平整的幾何圖形體現(xiàn)出來(lái)。這里展示使用矩形和圓形擬合兩種方法。
2.1 矩形包圍框擬合 - cv2.boundingRect()
在Python中OpenCV提供了cv2.boundingRect()來(lái)計(jì)算輪廓的最小矩形邊界的坐標(biāo) ,其語(yǔ)法如下
retval = cv2.boundingRect(array)
其中參數(shù)array為輪廓數(shù)組。即,cv2.findComtours()方法的執(zhí)行結(jié)果中的contours中的元素。
返回值retval是一個(gè)包含著四個(gè)整數(shù)值的元組,四個(gè)值依次是左上角頂點(diǎn)的橫坐標(biāo),左上角頂點(diǎn)的縱坐標(biāo),矩形的寬,矩形的高。
常常也可以寫成x,y,w,h = retval = cv2.boundingRect(array)
還以這張小鳥圖片(test1.jpg)為例,在上一個(gè)部分的示例中,我們找出并繪制出了圖中所有的輪廓,經(jīng)過調(diào)試,發(fā)現(xiàn)被識(shí)別出的輪廓共有94個(gè)。
我們要從數(shù)組列表中,選擇出表示小鳥輪廓的位置的數(shù)組。
從上圖中可以看出,小鳥的輪廓是所有輪廓中最大的。即該數(shù)組的 shape[0] 最大。即我們只用找出 shape[0]最大的即可。
import cv2 img = cv2.imread("test1.jpg")? # 從彩色圖像變成單通道灰度圖像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ? # 將灰度圖像進(jìn)行二值化閾值處理 t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 獲取二值化圖像中的輪廓極輪廓層次數(shù)據(jù) contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # 找出小鳥的輪廓 n1 = 1 n2 = 0 index = 0 for arr in contours: ? ? if len(arr) > n1: ? ? ? ? n1 = len(arr) ? ? ? ? index = n2 ? ? n2 += 1 print(index) x, y, w, h = cv2.boundingRect(contours[index]) # 繪制紅色矩形 cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) ? cv2.imshow("img", img)? cv2.waitKey() cv2.destroyAllWindows()?
繪制出矩形包圍框效果如下:
2.2圓形包圍框擬合 - cv2.minEnclosingCircle()
在Python中OpenCV提供了cv2.minEnclosingCircle()來(lái)計(jì)算輪廓的最小圓形邊界的圓心和半徑 ,其語(yǔ)法如下
center,radius = minEnclosingCircle(points)
其中
- points的輪廓數(shù)組
- center最小圓形包圍框的圓心的橫縱坐標(biāo)。是元組類型。
- radius是最小圓形包圍款更多半徑,浮點(diǎn)類型。
同樣的算法,只是這次調(diào)用cv2.minEnclosingCircle()方法,其他不變:
import cv2 img = cv2.imread("test1.jpg") # 讀取原圖 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 從彩色圖像變成單通道灰度圖像 # 將灰度圖像進(jìn)行二值化閾值處理 t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 獲取二值化圖像中的輪廓極輪廓層次數(shù)據(jù) contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) n1 = 1 n2 = 0 index = 0 for arr in contours: if len(arr) > n1: n1 = len(arr) index = n2 n2 += 1 center, radius = cv2.minEnclosingCircle(contours[index]) # 圓心點(diǎn)橫坐標(biāo)轉(zhuǎn)為近似整數(shù) x = int(round(center[0])) # 圓心點(diǎn)縱坐標(biāo)轉(zhuǎn)為近似整數(shù) y = int(round(center[1])) cv2.circle(img, (x, y), int(radius), (0, 0, 255), 2) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
繪制出圓形包圍框效果如下(因?yàn)槌叽鐔栴},只畫出了一部分):
3. 凸包 繪制
使用矩形框和圓形框?qū)D形的貼合程度往往都會(huì)較差。為了提高這個(gè)貼合程度,我們可以使用“凸包”。
所謂凸包,就是最逼近輪廓的多邊形。
在Python中OpenCV提供了 cv2.bonvexHull()方法來(lái)計(jì)算凸包
cv2.bonvexHull()方法語(yǔ)法如下:
hull = convexHull(points, clockwise=None, returnPoints=None)
其中
- points 是輪廓數(shù)組
- clockwise 是布爾類型的參數(shù),默認(rèn)為True,表示凸包中的點(diǎn)按順時(shí)針排序,為False時(shí)則按逆時(shí)針 排序。
- returnPoints 是布爾類型的參數(shù),默認(rèn)為True時(shí)返回點(diǎn)坐標(biāo)。如果為False則返回點(diǎn)索引。
返回值hull是凸包的點(diǎn)陣數(shù)組
依然以“test1.jpg為例”,為圖中的小鳥繪制凸包:
import cv2 img = cv2.imread("test1.jpg") # 轉(zhuǎn)為灰度圖像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化閾值處理 ret, binary = cv2.threshold(gray, 127, 225, cv2.THRESH_BINARY) # 檢測(cè)圖像中出現(xiàn)的所有輪廓 contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) n1 = 1 n2 = 0 index = 0 for arr in contours: if len(arr) > n1: n1 = len(arr) index = n2 n2 += 1 hull = cv2.convexHull(contours[index]) cv2.polylines(img, [hull], True, (0, 0, 255), 2) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
4. Canny邊緣檢測(cè) - cv2.Canny()
4.1 cv2.Canny() 用法簡(jiǎn)介
Canny邊緣檢測(cè)算法是John F.Canny在1986年開發(fā)的一個(gè)多級(jí)邊緣檢測(cè)算法。
Canny邊緣檢測(cè)算法通過像素的梯度變化尋找圖像的邊緣,最終可以繪制出十分精細(xì)的二值邊緣圖像
edges = cv2.Canny(image, threshold1, threshold2, apertureSize=None, L2gradient=None)
其中
- image 即原圖像
- threshold1 第一個(gè)閾值,一般為最小閾值
- threshold2 第二個(gè)閾值,一般為最大閾值
- apertureSize Sobel算子的孔徑大小
- L2gradient 計(jì)算圖像梯度的標(biāo)識(shí)。默認(rèn)為False。為True時(shí)采用更精準(zhǔn)的算法進(jìn)行計(jì)算。
關(guān)于這兩個(gè)閾值怎么用,這涉及到了算法的底層邏輯,還請(qǐng)自行探索。這里一種可以接受的解釋是:低于閾值1的像素點(diǎn),會(huì)被認(rèn)為不構(gòu)成邊緣,而高于閾值2的像素點(diǎn),會(huì)被認(rèn)為構(gòu)成邊緣。
最后返回值edges是一個(gè)二值的灰度圖像。
4.2 代碼示例
下邊對(duì)test1.jpg以三組不同的閾值來(lái)做Canny邊緣檢測(cè),根據(jù)處理結(jié)果感受算法效果:
- 當(dāng)閾值為 10-50 時(shí)
import cv2 img = cv2.imread("test1.jpg") r1 = cv2.Canny(img, 10, 50) cv2.imshow("r1", r1) cv2.waitKey() cv2.destroyAllWindows()
- 當(dāng)閾值為100-200時(shí)
import cv2 img = cv2.imread("test1.jpg") r2 = cv2.Canny(img, 100, 200) cv2.imshow("r2", r2) cv2.waitKey() cv2.destroyAllWindows()
- 當(dāng)閾值為400-600時(shí)
import cv2 img = cv2.imread("test1.jpg") r3 = cv2.Canny(img, 400, 600) cv2.imshow("r3", r3) cv2.waitKey() cv2.destroyAllWindows()
5. 霍夫變換
5.1 概述
霍夫變換是一種特征檢測(cè),通過霍夫變換可以檢測(cè)出圖像中存在的特殊的形狀。比如,直線,圓等。
霍夫變換檢測(cè)直線時(shí),算法有兩個(gè),
一個(gè)是cv2.HoughLines() 方法,用于檢測(cè)無(wú)限延長(zhǎng)的直線;
另一個(gè)是cv2.HoughLinesP() 方法,用于檢測(cè)線段。
霍夫變換檢測(cè)圓,使用的是**cv2.HoughCircles()**方法。
使用這三個(gè)方法前,都要先對(duì)圖像進(jìn)行降噪處理(使用濾波器),以去除干擾。
5.2 cv2.HoughLines() 檢測(cè)直線
cv2.HoughLines()語(yǔ)法如下:
lines = cv.HoughLines( image, rho, theta, threshold[,srn][,stn])
其中
- image 即原圖像
- rho 指的是搜索直線使用的半徑步長(zhǎng),其值為1時(shí)表示檢測(cè)所有。(即極坐標(biāo)中的ρ)
- theta 指的是搜索直線的角度,值為π/180°時(shí),表示檢測(cè)所有角度。(即極坐標(biāo)中的θ)
- threshold 指的是閾值,點(diǎn)的數(shù)量(也稱投票數(shù))。因?yàn)橹本€的長(zhǎng)度取決于直線上的點(diǎn)的數(shù)量。所以如果達(dá)不到這個(gè)長(zhǎng)度,就不會(huì)被
- 判定為直線。同理,當(dāng)該閾值越小,檢測(cè)出的直線也就越多。
- srn 對(duì)于多尺度霍夫變換,srn表示對(duì)rho的 距離分辨率 的除數(shù)
- stn 對(duì)于多尺度霍夫變換,stn表示對(duì)theta的 距離分辨率 的除數(shù)
- min_theat 對(duì)于標(biāo)準(zhǔn)和多尺度Hough變換,檢查線條的最小角度。必須介于0和最大θ之間。
- max_theat 對(duì)于標(biāo)準(zhǔn)和多尺度Hough變換,檢查線條的最大角度。必須介于min_theta和CV_PI之間。
返回值lines,是一個(gè)數(shù)組,shape為(n, 1, 2),n表示檢測(cè)出的所有線段數(shù)目,每個(gè)線段用極坐標(biāo)(ρ, θ)表示。
以此跨海大橋圖(test2.jpg)為例,對(duì)其使用cv2.HoughLines()方法,并繪制直線:
import cv2 import numpy as np img = cv2.imread("test2.jpg") o = img.copy() # 使用中值濾波進(jìn)行降噪 o = cv2.medianBlur(o, 5) # 從彩色圖像變成單通道灰度圖像 gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 繪制邊緣圖像 binary = cv2.Canny(o, 50, 150) # 檢測(cè)直線 不限步長(zhǎng),不限角度,至少50個(gè)點(diǎn)確定一條線 lines = cv2.HoughLines(binary, 1, np.pi / 180, 50) # print(lines) # print(lines.shape) for line in lines: rho, theta = line[0] a = np.cos(theta) b = np.sin(theta) x0 = a * rho y0 = b * rho x1 = int(x0 + 1000 * (-b)) y1 = int(y0 + 1000 * (a)) x2 = int(x0 - 1000 * (-b)) y2 = int(y0 - 1000 * (a)) cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
識(shí)別效果如下,可以自行調(diào)節(jié)參數(shù)進(jìn)行改良,并在這個(gè)過程中具體感受每個(gè)參數(shù)的作用。
當(dāng)選擇至少50個(gè)點(diǎn)確定一條線時(shí),一共檢測(cè)出168根直線:
當(dāng)選擇至少100個(gè)點(diǎn)確定一條線時(shí),一共檢測(cè)出35根直線:
當(dāng)選擇至少300個(gè)點(diǎn)確定一條直線時(shí),符合要求的直線有3根:
當(dāng)選擇至少380個(gè)點(diǎn)確定一條直線時(shí),這樣的直線還剩一根:
相比檢測(cè)直線,檢測(cè)線段的cv2.HoughLinesP()相對(duì)要更常用些。
5.3 cv2.HoughLinesP() 檢測(cè)線段
lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength=None, maxLineGap=None)
檢測(cè)線段
- image 原圖
- rho 檢測(cè)直線使用的半徑步長(zhǎng),值為1時(shí)表示所有可能的半徑步長(zhǎng)
- theta 搜索直線的角度
- threshold 閾值,該值越小,檢測(cè)出的直線越多。
- minLineLength表示線段的最小長(zhǎng)度,小于該長(zhǎng)度的線段不會(huì)被記錄在結(jié)果中。值越大線段越少。
- maxLineGap 表示允許將同一行的點(diǎn)連接起來(lái)的最大距離。 值越大線段越多。
返回值lines,是一個(gè)數(shù)組,shape為(n, 1, 4),n表示檢測(cè)出的所有線段數(shù)目,4指的是每個(gè)線段的兩端端點(diǎn)的笛卡爾坐標(biāo)(x, y) 坐標(biāo)的四個(gè)點(diǎn)。
其中minLineLength(最小線段長(zhǎng)度)和maxLineGap(最小線段距離)兩個(gè)參數(shù),都是越大,識(shí)別的線段越少。
import cv2 import numpy as np img = cv2.imread("test2.jpg") o = img.copy() # 使用中值濾波進(jìn)行降噪 o = cv2.medianBlur(o, 5) # 從彩色圖像變成單通道灰度圖像 gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 繪制邊緣圖像 binary = cv2.Canny(o, 50, 150) # 檢測(cè)線段,不限步長(zhǎng),不限角度,至少100個(gè)點(diǎn)確定一條線。最大將距離為200的線段連城一條線。 lines = cv2.HoughLinesP(binary, 1, np.pi / 180, 50, minLineLength=100, maxLineGap=200) print(lines.shape) for line in lines: x1, y1, x2, y2 = line[0] cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.imshow("canny", binary) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
二值化邊緣圖案效果:
描繪線段效果(minLineLength=100)至少100個(gè)點(diǎn)確定一條線段(上邊代碼),最大將距離為200的線段連接起來(lái)
共描繪了23條線:
描繪線段效果(minLineLength=500)至少500個(gè)點(diǎn)確定一條線段,最大將距離為200的線段連接起來(lái)
共描繪了6條線段:
描繪線段效果(minLineLength=720)至少720個(gè)點(diǎn)確定一條線段,最大將距離為200的線段連接起來(lái)
共描繪了一條線:
5.4 cv2.檢測(cè)圓 - HoughCircles()
circles = HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
其中
- image 原圖像(降噪、灰度處理后的)
- method 檢測(cè)方法。
- dp 累加器分辨率與原圖分辨率之比的倒數(shù)。值為1時(shí)累加器與原圖像有著相同的分辨率。通常選擇1作為參數(shù)。(值為2時(shí)則累加器的分辨率是原圖像的一半)
- minDist 圓心之間的最小距離
- param1 參數(shù)1,表示Canny邊緣檢測(cè)的最大閾值。是可選參數(shù)。
- param2 參數(shù)2,表示檢測(cè)結(jié)果投票數(shù)。即至少多少個(gè)點(diǎn)確定一個(gè)圓。值越大,識(shí)別的圓越少,約精準(zhǔn)。是可選參數(shù)。
- minRadius 圓環(huán)的最小半徑(可選參數(shù))
- maxRadius 圓環(huán)的最大半徑(可選參數(shù))
返回值circles是一個(gè)數(shù)組,數(shù)組內(nèi)是所有檢測(cè)出的圓環(huán),shape為(n,1,3)。其中3表示圓心的x坐標(biāo),圓心的y坐標(biāo)和半徑長(zhǎng)度三個(gè)指標(biāo)。
了解完語(yǔ)法,
接下來(lái)我們來(lái)檢測(cè)下圖(test3.jpg)中的客家土樓中的圓形。
import cv2 import numpy as np img = cv2.imread("test3.jpg") # 使用中值濾波進(jìn)行降噪 o = cv2.medianBlur(img, 11) # 從彩色圖像變成單通道灰度圖像 gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 展示灰度圖像 cv2.imshow('gray', gray) # 檢測(cè)圓環(huán),圓心最小間距為50,Canny最大閾值為40,投票數(shù)超過63。最小半徑為10,最大半徑為50 circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 50, param1=40, param2=63, minRadius=10, maxRadius=100) # 將數(shù)組元素四舍五入成整數(shù) circles = np.uint(np.around(circles)) # 遍歷圓環(huán)結(jié)果 for c in circles[0]: # 圓心橫坐標(biāo)、縱坐標(biāo)和圓半徑 x, y, r = c # 繪制圓環(huán) cv2.circle(img, (x, y), r, (0, 0, 255), 3) # 繪制圓心 cv2.circle(img, (x, y), 2, (0, 0, 255), 3) cv2.imshow("img", img) cv2.waitKey() cv2.destroyAllWindows()
降過噪的灰度圖像如下:
識(shí)別結(jié)果呈現(xiàn)如下,如圖成功識(shí)別出了圖中所有土樓的圓形:
以上就是Python OpenCV實(shí)現(xiàn)圖形檢測(cè)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV圖形檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python?OpenCV超詳細(xì)講解調(diào)整大小與圖像操作的實(shí)現(xiàn)
- Python?OpenCV超詳細(xì)講解讀取圖像視頻和網(wǎng)絡(luò)攝像頭
- Python中使用Opencv開發(fā)停車位計(jì)數(shù)器功能
- 關(guān)于python3?opencv?圖像二值化的問題(cv2.adaptiveThreshold函數(shù))
- Python?OpenCV實(shí)現(xiàn)3種濾鏡效果實(shí)例
- python?OpenCV?圖像通道數(shù)判斷
- 巧妙使用python?opencv庫(kù)玩轉(zhuǎn)視頻幀率
- python+opencv實(shí)現(xiàn)堆疊圖片
- python?使用OpenCV進(jìn)行曝光融合
相關(guān)文章
python 已知一個(gè)字符,在一個(gè)list中找出近似值或相似值實(shí)現(xiàn)模糊匹配
今天小編就為大家分享一篇python 已知一個(gè)字符,在一個(gè)list中找出近似值或相似值實(shí)現(xiàn)模糊匹配,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-02-02python利用datetime模塊計(jì)算程序運(yùn)行時(shí)間問題
這篇文章主要介紹了python利用datetime模塊計(jì)算程序運(yùn)行時(shí)間,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02python開發(fā)中range()函數(shù)用法實(shí)例分析
這篇文章主要介紹了python開發(fā)中range()函數(shù)用法,以實(shí)例形式較為詳細(xì)的分析了Python中range()函數(shù)遍歷列表的相關(guān)技巧,需要的朋友可以參考下2015-11-11用Python實(shí)現(xiàn)批量生成法務(wù)函代碼
大家好,本篇文章主要講的是用Python實(shí)現(xiàn)批量生成法務(wù)函代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02python實(shí)現(xiàn)微信小程序的多種支付方式
這篇文章主要為大家介紹了python實(shí)現(xiàn)微信小程序的多種支付方式的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04python使用win32com庫(kù)播放mp3文件的方法
這篇文章主要介紹了python使用win32com庫(kù)播放mp3文件的方法,涉及Python使用win32com庫(kù)操作音頻文件的相關(guān)技巧,需要的朋友可以參考下2015-05-05