opencv?python中cv.approxPolyDP函數(shù)詳細解釋
在OpenCV Python中,cv.approxPolyDP是一個用于多邊形逼近的函數(shù)。它使用Douglas-Peucker算法來減少多邊形的點數(shù)。
該函數(shù)需要兩個參數(shù):輸入多邊形和一個表示逼近精度的參數(shù)。輸入多邊形是一個由點組成的數(shù)組,而逼近精度是一個用于控制輪廓近似的精度參數(shù)。
該函數(shù)在輸入多邊形中保留重要的角度,并刪除不必要的頂點,從而減少了生成多邊形所需的點數(shù)。它可以用于圖像處理中的輪廓發(fā)現(xiàn)和分析,通過減少多邊形點數(shù),可以更容易地檢測和識別形狀。
下面是一個簡單的示例
展示了如何在OpenCV Python中使用cv.approxPolyDP來逼近多邊形:
import cv2 as cv import numpy as np # 讀取圖像 img = cv.imread("polygon.jpg") # 轉(zhuǎn)換為灰度圖像 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 二值化圖像 ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # 找到輪廓 contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # 逼近多邊形 approx = cv.approxPolyDP(contours[0], 0.01 * cv.arcLength(contours[0], True), True) # 繪制輪廓和逼近多邊形 cv.drawContours(img, [contours[0]], 0, (0, 255, 0), 2) cv.drawContours(img, [approx], 0, (255, 0, 0), 2) # 顯示圖像 cv.imshow("Image", img) cv.waitKey(0) cv.destroyAllWindows()
在此示例中,我們首先讀取圖像并將其轉(zhuǎn)換為灰度圖像。然后,我們使用cv.threshold將其轉(zhuǎn)換為二值化圖像,并使用cv.findContours找到其輪廓。接下來,我們將使用cv.approxPolyDP逼近多邊形。最后,我們使用cv.drawContours將原始輪廓和逼近多邊形繪制到圖像上。
請注意,實際應用中,需要使用適當?shù)闹祦碚{(diào)整逼近精度參數(shù),以使逼近過程產(chǎn)生最佳結(jié)果。
cv.approxPolyDP函數(shù)有三個參數(shù),分別是:
- curve:輸入多邊形的輪廓。
- epsilon:逼近精度參數(shù),表示逼近精度的界限。該參數(shù)是一個正數(shù),其值越小則逼近程度越高。通常建議使用輪廓周長的一定比例來計算該參數(shù),常見的比例因子為0.01。
- closed:布爾值參數(shù),表示輸出的逼近多邊形是否閉合。如果布爾值為True,則輸出的多邊形是封閉的。如果為False,則只返回線段。
在實際使用時,需要針對具體的應用場景和圖像情況來調(diào)整epsilon的值,以充分利用其控制逼近精度的功能。
需要注意的是,函數(shù)返回值是輸出的逼近多邊形的點數(shù)組形式,可以使用cv.drawContours函數(shù)將其繪制到圖像上。
cv.approxPolyDP 函數(shù)返回的是多邊形的頂點坐標數(shù)組,可以使用cv.contourArea函數(shù)根據(jù)這些頂點坐標計算多邊形的面積。需要注意的是,cv.contourArea 函數(shù)只能用于計算封閉的輪廓的面積,因此需要在調(diào)用cv.approxPolyDP 函數(shù)時將 closed 參數(shù)設(shè)為 True,以輸出封閉的多邊形輪廓。
具體的代碼實現(xiàn)方法如下:
# 輸入輪廓 contour,逼近精度 epsilon 和封閉參數(shù) closed,返回逼近多邊形的面積 def compute_approxPolyDP_area(contour, epsilon, closed=True): # 計算逼近多邊形的頂點坐標 approx = cv.approxPolyDP(contour, epsilon, closed) # 計算逼近多邊形的面積 area = cv.contourArea(approx) return area
其中,輸入?yún)?shù) contour 是輸入輪廓的頂點坐標數(shù)組,epsilon 是逼近精度參數(shù),closed 是封閉參數(shù);輸出結(jié)果 area 是逼近多邊形的面積。
可以使用 OpenCV 中的函數(shù) cv2.minAreaRect 和 cv2.boxPoints 來計算輪廓包圍圖形的最小矩形框,并得到矩形框的的四個頂點坐標。然后可以使用 Python 矩形操作庫 Shapely 來計算矩形和輪廓交集的面積。
具體的步驟如下:
- 使用 cv2.findContours 函數(shù)得到輸入輪廓的頂點坐標數(shù)組。
# img 為輸入圖像 contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
- 使用 cv2.minAreaRect 函數(shù)計算輪廓包圍的最小矩形框及其四個頂點的坐標。
rect = cv2.minAreaRect(contours[0]) # 計算最小矩形框 box = cv2.boxPoints(rect) # 得到矩形框的四個頂點坐標 box = np.int0(box) # 轉(zhuǎn)換為整型
- 使用 Shapely 庫計算矩形和輪廓交集的面積。
from shapely.geometry import Polygon # 計算矩形和輪廓交集的面積 intersection_area = 0 if len(contours) > 0: polygon = Polygon(contours[0].reshape(-1, 2)) rect_polygon = Polygon(box.reshape(-1, 2)) intersection = rect_polygon.intersection(polygon) if intersection.geom_type == 'Polygon': intersection_area = intersection.area
其中,Polygon 函數(shù)用于創(chuàng)建一個多邊形對象,intersection 函數(shù)用于計算兩個多邊形的交集。最終的 intersection_area 變量即為矩形和輪廓交集的面積。
完整代碼如下所示:
import cv2 import numpy as np from shapely.geometry import Polygon # 讀取輸入圖像 img = cv2.imread('input.jpg', 0) # 計算輪廓 contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 計算最小矩形框 rect = cv2.minAreaRect(contours[0]) box = cv2.boxPoints(rect) box = np.int0(box) # 計算矩形和輪廓交集的面積 intersection_area = 0 if len(contours) > 0: polygon = Polygon(contours[0].reshape(-1, 2)) rect_polygon = Polygon(box.reshape(-1, 2)) intersection = rect_polygon.intersection(polygon) if intersection.geom_type == 'Polygon': intersection_area = intersection.area # 輸出交集面積 print("Intersection area:", intersection_area)
其中,input.jpg 為輸入圖像文件名,可以替換為其他圖像。
使用 OpenCV 中的函數(shù) cv2.boundingRect 對多邊形逼近得到的輪廓進行包圍矩形計算時,得到的坐標是最小矩形的左上角坐標和寬度高度。也就是說,boundingRect 得到的矩形框是能夠完全覆蓋多邊形的最小矩形框,而不是包含多邊形的最大矩形框。
簡單來說,boundingRect 得到的矩形框是能夠最小化多邊形占用的空間大小的矩形框。實際應用中,boundingRect 函數(shù)通常用于求取多邊形的包圍盒,以便進行后續(xù)圖形處理、物體識別等操作。
注意事項:
Douglas-Peucker算法:
(1)在曲線的起點 A 和終點 B 之間做一條直線 AB,是曲線的弦;
(2)尋找曲線上離該直線段距離最大的點 C,計算其與 AB 的距離 d;
(3)比較距離 d 與設(shè)定的閾值 threshold,如果小于設(shè)定閾值則該直線段作為曲線的近似,該段曲線處理完畢。
(4)如果距離 d 大于設(shè)定閾值,則以 C 點將曲線 AB 分為兩段 AC 和 BC,并分別對這兩段進行以上步驟的處理。
(5)當所有曲線都處理完畢時,依次連接所有分割點形成的折線,作為曲線的近似。
總結(jié)
到此這篇關(guān)于opencv python中cv.approxPolyDP函數(shù)詳細解釋的文章就介紹到這了,更多相關(guān)opencv python中的cv.approxPolyDP 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3.6之xlwt如何設(shè)置單元格對齊方式
這篇文章主要介紹了python3.6之xlwt如何設(shè)置單元格對齊方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06Python安裝后測試連接MySQL數(shù)據(jù)庫方式
這篇文章主要介紹了Python安裝后測試連接MySQL數(shù)據(jù)庫方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07Python網(wǎng)絡(luò)爬蟲神器PyQuery的基本使用教程
這篇文章主要給大家介紹了關(guān)于Python網(wǎng)絡(luò)爬蟲神器PyQuery的基本使用教程,文中通過示例代碼介紹的非常詳細,對大家學習使用PyQuery具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-02-02