最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

opencv?python中cv.approxPolyDP函數(shù)詳細(xì)解釋

 更新時(shí)間:2024年01月30日 10:11:16   作者:清風(fēng)云襄  
這篇文章主要給大家介紹了關(guān)于opencv?python中cv.approxPolyDP函數(shù)詳細(xì)解釋的相關(guān)資料,OpenCV中的approxPolyDP()函數(shù)用于對(duì)形狀進(jìn)行逼近,以減少多邊形的頂點(diǎn)數(shù),可以用于對(duì)圖像輪廓點(diǎn)進(jìn)行多邊形擬合,需要的朋友可以參考下

在OpenCV Python中,cv.approxPolyDP是一個(gè)用于多邊形逼近的函數(shù)。它使用Douglas-Peucker算法來減少多邊形的點(diǎn)數(shù)。

該函數(shù)需要兩個(gè)參數(shù):輸入多邊形和一個(gè)表示逼近精度的參數(shù)。輸入多邊形是一個(gè)由點(diǎn)組成的數(shù)組,而逼近精度是一個(gè)用于控制輪廓近似的精度參數(shù)。

該函數(shù)在輸入多邊形中保留重要的角度,并刪除不必要的頂點(diǎn),從而減少了生成多邊形所需的點(diǎn)數(shù)。它可以用于圖像處理中的輪廓發(fā)現(xiàn)和分析,通過減少多邊形點(diǎn)數(shù),可以更容易地檢測和識(shí)別形狀。

下面是一個(gè)簡單的示例

展示了如何在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將原始輪廓和逼近多邊形繪制到圖像上。

請(qǐng)注意,實(shí)際應(yīng)用中,需要使用適當(dāng)?shù)闹祦碚{(diào)整逼近精度參數(shù),以使逼近過程產(chǎn)生最佳結(jié)果。

cv.approxPolyDP函數(shù)有三個(gè)參數(shù),分別是:

  • curve:輸入多邊形的輪廓。
  • epsilon:逼近精度參數(shù),表示逼近精度的界限。該參數(shù)是一個(gè)正數(shù),其值越小則逼近程度越高。通常建議使用輪廓周長的一定比例來計(jì)算該參數(shù),常見的比例因子為0.01。
  • closed:布爾值參數(shù),表示輸出的逼近多邊形是否閉合。如果布爾值為True,則輸出的多邊形是封閉的。如果為False,則只返回線段。

在實(shí)際使用時(shí),需要針對(duì)具體的應(yīng)用場景和圖像情況來調(diào)整epsilon的值,以充分利用其控制逼近精度的功能。

需要注意的是,函數(shù)返回值是輸出的逼近多邊形的點(diǎn)數(shù)組形式,可以使用cv.drawContours函數(shù)將其繪制到圖像上。

cv.approxPolyDP 函數(shù)返回的是多邊形的頂點(diǎn)坐標(biāo)數(shù)組,可以使用cv.contourArea函數(shù)根據(jù)這些頂點(diǎn)坐標(biāo)計(jì)算多邊形的面積。需要注意的是,cv.contourArea 函數(shù)只能用于計(jì)算封閉的輪廓的面積,因此需要在調(diào)用cv.approxPolyDP 函數(shù)時(shí)將 closed 參數(shù)設(shè)為 True,以輸出封閉的多邊形輪廓。

具體的代碼實(shí)現(xiàn)方法如下:

# 輸入輪廓 contour,逼近精度 epsilon 和封閉參數(shù) closed,返回逼近多邊形的面積
def compute_approxPolyDP_area(contour, epsilon, closed=True):
    # 計(jì)算逼近多邊形的頂點(diǎn)坐標(biāo)
    approx = cv.approxPolyDP(contour, epsilon, closed)
    # 計(jì)算逼近多邊形的面積
    area = cv.contourArea(approx)
    return area

其中,輸入?yún)?shù) contour 是輸入輪廓的頂點(diǎn)坐標(biāo)數(shù)組,epsilon 是逼近精度參數(shù),closed 是封閉參數(shù);輸出結(jié)果 area 是逼近多邊形的面積。

可以使用 OpenCV 中的函數(shù) cv2.minAreaRect 和 cv2.boxPoints 來計(jì)算輪廓包圍圖形的最小矩形框,并得到矩形框的的四個(gè)頂點(diǎn)坐標(biāo)。然后可以使用 Python 矩形操作庫 Shapely 來計(jì)算矩形和輪廓交集的面積。

具體的步驟如下:

  • 使用 cv2.findContours 函數(shù)得到輸入輪廓的頂點(diǎn)坐標(biāo)數(shù)組。
# img 為輸入圖像
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  • 使用 cv2.minAreaRect 函數(shù)計(jì)算輪廓包圍的最小矩形框及其四個(gè)頂點(diǎn)的坐標(biāo)。
rect = cv2.minAreaRect(contours[0])  # 計(jì)算最小矩形框
box = cv2.boxPoints(rect)  # 得到矩形框的四個(gè)頂點(diǎn)坐標(biāo)
box = np.int0(box)  # 轉(zhuǎn)換為整型
  • 使用 Shapely 庫計(jì)算矩形和輪廓交集的面積。
from shapely.geometry import Polygon

# 計(jì)算矩形和輪廓交集的面積
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)建一個(gè)多邊形對(duì)象,intersection 函數(shù)用于計(jì)算兩個(gè)多邊形的交集。最終的 intersection_area 變量即為矩形和輪廓交集的面積。

完整代碼如下所示:

import cv2
import numpy as np
from shapely.geometry import Polygon

# 讀取輸入圖像
img = cv2.imread('input.jpg', 0)

# 計(jì)算輪廓
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 計(jì)算最小矩形框
rect = cv2.minAreaRect(contours[0])
box = cv2.boxPoints(rect)
box = np.int0(box)

# 計(jì)算矩形和輪廓交集的面積
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 對(duì)多邊形逼近得到的輪廓進(jìn)行包圍矩形計(jì)算時(shí),得到的坐標(biāo)是最小矩形的左上角坐標(biāo)和寬度高度。也就是說,boundingRect 得到的矩形框是能夠完全覆蓋多邊形的最小矩形框,而不是包含多邊形的最大矩形框。

簡單來說,boundingRect 得到的矩形框是能夠最小化多邊形占用的空間大小的矩形框。實(shí)際應(yīng)用中,boundingRect 函數(shù)通常用于求取多邊形的包圍盒,以便進(jìn)行后續(xù)圖形處理、物體識(shí)別等操作。

注意事項(xiàng):

Douglas-Peucker算法:

(1)在曲線的起點(diǎn) A 和終點(diǎn) B 之間做一條直線 AB,是曲線的弦;

(2)尋找曲線上離該直線段距離最大的點(diǎn) C,計(jì)算其與 AB 的距離 d;

(3)比較距離 d 與設(shè)定的閾值 threshold,如果小于設(shè)定閾值則該直線段作為曲線的近似,該段曲線處理完畢。

(4)如果距離 d 大于設(shè)定閾值,則以 C 點(diǎn)將曲線 AB 分為兩段 AC 和 BC,并分別對(duì)這兩段進(jìn)行以上步驟的處理。

(5)當(dāng)所有曲線都處理完畢時(shí),依次連接所有分割點(diǎn)形成的折線,作為曲線的近似。

總結(jié)

到此這篇關(guān)于opencv python中cv.approxPolyDP函數(shù)詳細(xì)解釋的文章就介紹到這了,更多相關(guān)opencv python中的cv.approxPolyDP 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python?Pandas數(shù)據(jù)合并pd.merge用法詳解

    Python?Pandas數(shù)據(jù)合并pd.merge用法詳解

    在合并數(shù)據(jù)的操作中,除了pd.concat()函數(shù),另一個(gè)常用的函數(shù)就是pd.merge()了,下面這篇文章主要給大家介紹了關(guān)于Python?Pandas數(shù)據(jù)合并pd.merge用法的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Python學(xué)習(xí)筆記(二)基礎(chǔ)語法

    Python學(xué)習(xí)筆記(二)基礎(chǔ)語法

    對(duì)于任何一門語言的學(xué)習(xí),學(xué)語法是最枯燥無味的,但又不得不學(xué),基礎(chǔ)概念較繁瑣,本文將不多涉及概念解釋,用例子進(jìn)行相關(guān)解析,適當(dāng)與C語言對(duì)比,避免陷入語法的苦海。我認(rèn)為初學(xué)者學(xué)習(xí)語法的目標(biāo)是學(xué)會(huì)使用即可,關(guān)于對(duì)概念的深入理解,剖析,沒有一定的知識(shí)積累是很難做到的。
    2014-06-06
  • Python查看Tensor尺寸及查看數(shù)據(jù)類型的實(shí)現(xiàn)

    Python查看Tensor尺寸及查看數(shù)據(jù)類型的實(shí)現(xiàn)

    這篇文章主要介紹了Python查看Tensor尺寸及查看數(shù)據(jù)類型的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • python3 面向?qū)ο骭_類的內(nèi)置屬性與方法的實(shí)例代碼

    python3 面向?qū)ο骭_類的內(nèi)置屬性與方法的實(shí)例代碼

    這篇文章主要介紹了python3 面向?qū)ο骭_類的內(nèi)置屬性與方法的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Pytorch建模過程中的DataLoader與Dataset示例詳解

    Pytorch建模過程中的DataLoader與Dataset示例詳解

    這篇文章主要介紹了Pytorch建模過程中的DataLoader與Dataset,同時(shí)PyTorch針對(duì)不同的專業(yè)領(lǐng)域,也提供有不同的模塊,例如?TorchText,?TorchVision,?TorchAudio,這些模塊中也都包含一些真實(shí)數(shù)據(jù)集示例,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-01-01
  • python3.7 sys模塊的具體使用

    python3.7 sys模塊的具體使用

    這篇文章主要介紹了python3.7 sys模塊的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python實(shí)現(xiàn)簡單成績錄入系統(tǒng)

    python實(shí)現(xiàn)簡單成績錄入系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡單成績錄入系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Python的列表推導(dǎo)式實(shí)例詳細(xì)解析

    Python的列表推導(dǎo)式實(shí)例詳細(xì)解析

    這篇文章主要介紹了Python的列表推導(dǎo)式實(shí)例詳細(xì)解析,列表推導(dǎo)式是Python構(gòu)建列表list的一種快捷方式,可以使用簡潔的代碼就創(chuàng)建出一個(gè)列表,需要的朋友可以參考下
    2023-07-07
  • Python queue隊(duì)列原理與應(yīng)用案例分析

    Python queue隊(duì)列原理與應(yīng)用案例分析

    這篇文章主要介紹了Python queue隊(duì)列原理與應(yīng)用,結(jié)合具體案例形式分析了Python queue隊(duì)列的原理、功能、實(shí)現(xiàn)方法與使用技巧,需要的朋友可以參考下
    2019-09-09
  • 在python中實(shí)現(xiàn)將一張圖片剪切成四份的方法

    在python中實(shí)現(xiàn)將一張圖片剪切成四份的方法

    今天小編就為大家分享一篇在python中實(shí)現(xiàn)將一張圖片剪切成四份的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評(píng)論

巴彦淖尔市| 四川省| 阳山县| 和硕县| 宜兰市| 陇西县| 独山县| 洪江市| 慈利县| 龙游县| 墨江| 云龙县| 博白县| 望城县| 白城市| 新晃| 冕宁县| 新余市| 新竹县| 祁阳县| 新巴尔虎右旗| 鄯善县| 枣庄市| 乌兰县| 桑日县| 都昌县| 那曲县| 镇江市| 汕尾市| 搜索| 自治县| 宣武区| 偃师市| 康马县| 河西区| 垦利县| 玉溪市| 新晃| 嘉荫县| 无棣县| 重庆市|