婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > OpenCV-Python實現(xiàn)輪廓擬合

OpenCV-Python實現(xiàn)輪廓擬合

熱門標(biāo)簽:騰訊地圖標(biāo)注沒法顯示 ai電銷機器人的優(yōu)勢 海外網(wǎng)吧地圖標(biāo)注注冊 聊城語音外呼系統(tǒng) 孝感營銷電話機器人效果怎么樣 南陽打電話機器人 地圖標(biāo)注自己和別人標(biāo)注區(qū)別 商家地圖標(biāo)注海報 打電話機器人營銷

前言

什么是輪廓?

輪廓可以簡單認(rèn)為成將連續(xù)的點(連著邊界)連在一起的曲線,具有相同 的顏色或者灰度。輪廓在形狀分析和物體的檢測和識別中很有用。

  • 為了更加準(zhǔn)確,要使用二值化圖像。在尋找輪廓之前,要進行閾值化處理 或者 Canny 邊界檢測。
  • 查找輪廓的函數(shù)會修改原始圖像。如果你在找到輪廓之后還想使用原始圖 像的話,你應(yīng)該將原始圖像存儲到其他變量中。
  • 在 OpenCV 中,查找輪廓就像在黑色背景中超白色物體。你應(yīng)該記住, 要找的物體應(yīng)該是白色而背景應(yīng)該是黑色。

在計算輪廓時,可能并不需要實際的輪廓,而僅需要一個接近于輪廓的近似多邊形。比如矩形其實都是差不多的輪廓,都是長寬不相等且平行的四邊形,那么只要提供一個近似的輪廓,我們就可以區(qū)分形狀。

在OpenCV中,它給我們提供了cv2.boundingRect()函數(shù)來繪制輪廓的矩形邊界,其完整定義如下:

def boundingRect(array):

array:前面已經(jīng)介紹過,array是一個灰度圖像,或者輪廓。

該函數(shù)返回3個值時,是矩形邊界的左上角頂點的坐標(biāo)值以及矩形邊界的寬與高。返回4個值時,是矩形左上角頂點的x坐標(biāo),y坐標(biāo),以及寬高。

繪制橢圓的矩形邊界

現(xiàn)在,我們還是使用前面的一張橢圓圖形,如下圖所示:


得到圖形之后,我們使用上面的函數(shù),計算該圖像輪廓的4值,代碼如下:

import cv2

img = cv2.imread("26_1.jpg")

# 轉(zhuǎn)換為灰度圖像
gray = cv2.cvtColor(img1, 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[0])
print(x, y, w, h)

運行之后,控制臺輸出如下內(nèi)容:


這里我們得到了橢圓的矩形左上角坐標(biāo)為(53,120),其寬高分別為272與84。

既然我們已經(jīng)得到了其矩形邊界的坐標(biāo)以及寬高,那么我們可以開始繪制其矩形邊界。前面提取輪廓繪制用的是cv2.drawContours()函數(shù),這里同樣也是。

代碼如下:

import cv2
import numpy as np

img = cv2.imread("26_1.jpg")
cv2.imshow("img1",img)
# 轉(zhuǎn)換為灰度圖像
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[0])
rect=np.array([[[x,y],[x+w,y],[x+w,y+h],[x,y+h]]])#1
cv2.drawContours(img,[rect],-1,(255,255,255),2)#1

cv2.imshow("img2",img)

cv2.waitKey()
cv2.destroyAllWindows()

運行之后,其橢圓的矩形邊界就被我們標(biāo)記出來了,效果如下:


當(dāng)然,這里我們還可以使用另一個函數(shù)cv2.rectangle()來繪制矩形邊界,值需要更換上面代碼中注釋1的兩個代碼,具體如下所示:

cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255,255),2)

最小包圍矩形框

在OpenCV中,它還提供了cv2.minAreaRect()來繪制最小包圍矩形框,其完整定義如下:

def minAreaRect(points):

其中points參數(shù)是輪廓,返回值為矩形特征信息,包括矩形的中心(x,y),寬高,以及旋轉(zhuǎn)角度。

特別注意,minAreaRect函數(shù)的返回值并不能直接代入drawContours()函數(shù)中。因此,我們必須將其轉(zhuǎn)換為符合要求的結(jié)構(gòu)才能接著操作。通過cv2.boxPoint()函數(shù)就可以轉(zhuǎn)換為符合drawContours()的結(jié)構(gòu)參數(shù)。

還是上面那張圖,不過我們用旋轉(zhuǎn)后的橢圓原圖,代碼如下:

import cv2
import numpy as np

img = cv2.imread("26_4.jpg")

cv2.imshow("img1",img)
# 轉(zhuǎn)換為灰度圖像
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)
rect= cv2.minAreaRect(contours[0])
print(rect)
points=cv2.boxPoints(rect)
print(points)
points=np.int0(points)
print(points)
cv2.drawContours(img,[points],0,(255,255,255),2)

cv2.imshow("img2",img)

cv2.waitKey()
cv2.destroyAllWindows()

運行之后,圖像效果以及控制臺的輸出信息如下:



這里我們可以清楚的看到minAreaRect()函數(shù)返回值的轉(zhuǎn)換過程。先通過boxPoints()函數(shù)轉(zhuǎn)換為drawContours()函數(shù)能接受的參數(shù)格式,然后通過取整轉(zhuǎn)換為具體的像素坐標(biāo)值。

最小包圍圓形框

既然有最小包圍矩形框,那么一定就有最小包圍圓形框。在OpenCV中,它給我們提供cv2.minEnclosingCircle()函數(shù)來繪制最小包圍圓形框。

函數(shù)的完整定義如下:

def minEnclosingCircle(points): 

這里的參數(shù)與上面的points參數(shù)一致,但是其返回值并不相同,畢竟繪制圓形肯定與繪制矩形的參數(shù)肯定不一樣。

它有兩個返回值,一個是圓形的中心坐標(biāo)(x,y),一個是圓形的半徑r。下面,我們直接來繪制上面橢圓的最小包圍圓形框。具體代碼如下所示:

import cv2
import numpy as np

img = cv2.imread("26_4.jpg")

cv2.imshow("img1", img)
# 轉(zhuǎn)換為灰度圖像
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), r = cv2.minEnclosingCircle(contours[0])
center = (int(x), int(y))
r = int(r)
cv2.circle(img, center, r, (255, 255, 255), 2)

cv2.imshow("img2", img)

cv2.waitKey()
cv2.destroyAllWindows()

運行之后,效果如下所示:

最優(yōu)擬合橢圓

在OpenCV中,它給我們提供了cv2.fitEllipse()函數(shù)繪制最優(yōu)擬合橢圓。其完整的定義如下:

def fitEllipse(points):

其中points參數(shù)與前文一致,而它的返回值是RotatedRect類型,這是因為該函數(shù)返回的是擬合橢圓的外接矩形,包括矩形的質(zhì)心,寬高,旋轉(zhuǎn)角度等信息,這些信息正好與橢圓的中心點,軸長度,旋轉(zhuǎn)角度一致。

下面,我們來使用該函數(shù)繪制最優(yōu)擬合橢圓,這里我們選取如上圖所示的一張矩形圖。具體代碼如下:

import cv2

img = cv2.imread("27.jpg")

cv2.imshow("img1", img)
# 轉(zhuǎn)換為灰度圖像
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[0])

cv2.ellipse(img, ellipse, (0, 0, 255), 3)

cv2.imshow("img2", img)

cv2.waitKey()
cv2.destroyAllWindows()

運行之后,效果如下所示:

最優(yōu)擬合直線

在OpenCV中,它還提供了cv2.fitLine()函數(shù)繪制最優(yōu)擬合直線,其完整定義如下:

def fitEllipse(points):

points:與前文一樣,是輪廓

distType:距離類型。擬合直線時,要使輸入點到擬合直線的距離之和最小。詳細(xì)參數(shù)定義參考開發(fā)文檔,這里不在贅述。

param:距離參數(shù),與所選距離類型有關(guān)。當(dāng)該參數(shù)為0時,自動選擇最優(yōu)值。

reps:用于表示擬合直線所需要的徑向精度,通常該值被設(shè)定為0.01

aeps:用于表示擬合直線所需要的角度精度,通常該值被設(shè)定為0.01

對于二維直線,返回值line為4維,前兩維代表擬合出的直線的方向,后兩位代表直線上的一點。

下面,我們來直接使用代碼繪制最優(yōu)擬合直線。

import cv2

img = cv2.imread("27.jpg")

cv2.imshow("img1", img)
# 轉(zhuǎn)換為灰度圖像
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[0])

cv2.ellipse(img, ellipse, (0, 0, 255), 3)

cv2.imshow("img2", img)

cv2.waitKey()
cv2.destroyAllWindows()

運行之后,效果如下所示:

對于繪制直線來說,我們需要獲取繪制直線的起點以及終點,這里lefty為起點,righty為終點。

最小外包三角形

在OpenCV,它還提供了cv2.minEnclosingTriangle()函數(shù)來繪制最小外包三角形。其完整定義如下:

def minEnclosingTriangle(points, triangle=None):

其中points與前文類似,其返回值triangle為外包三角形的三個頂點集。

下面,我們直接構(gòu)建最小外包三角形,具體代碼如下:

import cv2

img = cv2.imread("27.jpg")

cv2.imshow("img1", img)
# 轉(zhuǎn)換為灰度圖像
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)

area, trg1 = cv2.minEnclosingTriangle(contours[0])
print(area)
print(trg1)
for i in range(0, 3):
    cv2.line(img, tuple(trg1[i][0]), tuple(trg1[(i + 1) % 3][0]), (0, 255, 0), 2)

cv2.imshow("img2", img)

cv2.waitKey()
cv2.destroyAllWindows()

運行之后,效果如下:

需要注意的是,在cv2中沒有直接繪制三角形的函數(shù),所以我們通過繪制三條直線,繪制三角形,minEnclosingTriangle()函數(shù)第一個返回值為三角形面積,第二返回值是三點坐標(biāo)。

逼近多邊形

在OpenCV中,它還提供了cv2.approxPolyDP()函數(shù)構(gòu)建指定邊數(shù)的逼近多邊形。其完整定義如下:

def approxPolyDP(curve, epsilon, closed, approxCurve=None): 

curve:輪廓

epsilon:精度,原始輪廓的邊界點與逼近多邊形邊界之間的最大距離

closed:布爾類型。為True時,表示逼近多邊形是封閉的。為False時,biao表示畢竟多邊形是不封閉的。

approxCurve為該函數(shù)的返回值,是逼近多邊形的點集。。

下面,我們來實現(xiàn)各類逼近多邊形的繪制,代碼如下:

import cv2

img = cv2.imread("24.jpg")

list=[0.1,0.09,0.055,0.05,0.02]

cv2.imshow("img", img)
# 轉(zhuǎn)換為灰度圖像
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)

for i, val in enumerate(list):
    epsilon = val * cv2.arcLength(contours[0], True)
    approx = cv2.approxPolyDP(contours[0], epsilon, True)
    cv2.drawContours(img, [approx], 0, (0, 255, 0), 2)

    cv2.imshow("img"+str(i), img)

cv2.waitKey()
cv2.destroyAllWindows()

運行之后,效果如下:

cv2.approxPolyDP()函數(shù)采用的是Douglas-Peucker算法,該算法的原理是首先從輪廓中找到距離最遠(yuǎn)的兩個點,并將兩個點相連。接下來,在輪廓上找到一個離當(dāng)前直線最遠(yuǎn)的點,并將該點與原有直線連成一個封閉的多邊形,此時得到一個三角形。以此類推四邊形,五邊形,六邊形等。當(dāng)前多邊形的距離都小于函數(shù)cv2.approxPolyDP()的參數(shù)epsilon的值時,就停止迭代。

到此這篇關(guān)于OpenCV-Python實現(xiàn)輪廓擬合的文章就介紹到這了,更多相關(guān)OpenCV 輪廓擬合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python通過OpenCV的findContours獲取輪廓并切割實例
  • Python Opencv實現(xiàn)圖像輪廓識別功能
  • OpenCV-Python實現(xiàn)輪廓檢測實例分析
  • OpenCV 輪廓檢測的實現(xiàn)方法
  • Opencv提取連通區(qū)域輪廓的方法
  • python+opencv輪廓檢測代碼解析
  • C#中OpenCVSharp實現(xiàn)輪廓檢測
  • OpenCV實現(xiàn)圖像輪廓檢測以及外接矩形
  • opencv提取外部輪廓并在外部加矩形框
  • Opencv實現(xiàn)輪廓提取功能

標(biāo)簽:南寧 撫州 六盤水 楊凌 揚州 聊城 牡丹江 迪慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《OpenCV-Python實現(xiàn)輪廓擬合》,本文關(guān)鍵詞  OpenCV-Python,實現(xiàn),輪廓,擬合,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《OpenCV-Python實現(xiàn)輪廓擬合》相關(guān)的同類信息!
  • 本頁收集關(guān)于OpenCV-Python實現(xiàn)輪廓擬合的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美三级欧美一级| www.av精品| 亚洲夂夂婷婷色拍ww47| **性色生活片久久毛片| 中文字幕成人av| 亚洲同性gay激情无套| 一区二区三区日韩欧美| 亚洲一二三区不卡| 五月婷婷综合网| 日本欧美韩国一区三区| 久草精品在线观看| 国产一区二区精品久久99| 国产一区二区三区在线观看免费视频 | 国产裸体歌舞团一区二区| 久久精品国产亚洲高清剧情介绍| 久久国产精品无码网站| 韩国理伦片一区二区三区在线播放| 国内一区二区视频| 成人av网在线| 欧美日韩一区二区在线视频| 日韩一区和二区| 亚洲国产精华液网站w| 一区二区三区高清在线| 日韩成人午夜精品| 粉嫩aⅴ一区二区三区四区| 91同城在线观看| 91精品国产综合久久久蜜臀图片| 欧美精品一区二区三区很污很色的 | 亚洲成年人网站在线观看| 免费看欧美美女黄的网站| 成人一区二区视频| 欧美精品色综合| 久久精品视频免费观看| 亚洲午夜久久久久久久久久久| 久久精品国产亚洲高清剧情介绍 | 国产人久久人人人人爽| 亚洲精品成a人| 国产一区二区三区免费看| 一本一道久久a久久精品 | 日韩视频一区二区| 国产精品久久久久久久久免费丝袜 | 欧美精三区欧美精三区| 国产天堂亚洲国产碰碰| 亚洲成人tv网| 97久久超碰精品国产| 久久亚区不卡日本| 亚洲国产中文字幕| 91在线视频官网| 久久人人爽爽爽人久久久| 丝袜a∨在线一区二区三区不卡| 成人黄色软件下载| 日韩欧美中文字幕一区| 一区二区三区免费网站| 成人激情图片网| 久久综合久久鬼色中文字| 丝袜美腿亚洲综合| 欧美亚洲综合网| 亚洲欧洲国产日韩| 国产成人在线观看| 久久久久久久综合色一本| 奇米影视7777精品一区二区| 欧美又粗又大又爽| 亚洲精品中文在线| 91网站黄www| 亚洲日韩欧美一区二区在线| 丁香桃色午夜亚洲一区二区三区| 欧美成人精品1314www| 蜜桃91丨九色丨蝌蚪91桃色| 欧美午夜不卡在线观看免费| 一区二区欧美在线观看| 在线观看亚洲精品| 亚洲午夜免费福利视频| 欧美日韩中文国产| 亚洲mv大片欧洲mv大片精品| 欧美亚洲另类激情小说| 亚洲国产你懂的| 欧美剧情电影在线观看完整版免费励志电影| 亚洲天堂2016| 欧美日韩在线播放三区| 日韩电影在线免费| 精品理论电影在线| 国产91精品免费| 国产精品乱人伦| 一本大道av一区二区在线播放| 亚洲色图视频网站| 欧美亚洲图片小说| 蜜桃久久av一区| 国产欧美一区在线| 成人美女在线观看| 亚洲精品日韩一| 4438成人网| 国产激情一区二区三区四区| 国产精品伦理在线| 欧美狂野另类xxxxoooo| 青青草国产精品亚洲专区无| 久久久国产综合精品女国产盗摄| 成人a免费在线看| 亚洲一区av在线| 精品国产欧美一区二区| 成人激情开心网| 天堂va蜜桃一区二区三区| 久久久噜噜噜久久人人看| 99久久99久久久精品齐齐| 三级久久三级久久| 欧美激情一区在线观看| 日本道精品一区二区三区| 久久精品99国产精品| 日韩一区在线看| 精品久久久久香蕉网| 日本韩国视频一区二区| 韩日精品视频一区| 亚洲国产精品一区二区久久恐怖片 | 欧美国产精品一区| 欧美日免费三级在线| 成人免费va视频| 另类综合日韩欧美亚洲| 亚洲欧洲色图综合| 欧美成人一区二区三区| 欧美性猛片xxxx免费看久爱| 国产成人av一区二区三区在线| 午夜视频一区在线观看| 亚洲欧美在线高清| 久久久综合激的五月天| 91精品在线一区二区| 91国产免费看| 成人高清视频在线观看| 国产麻豆精品theporn| 日本在线不卡视频| 亚洲成人动漫精品| 伊人色综合久久天天| 亚洲欧洲韩国日本视频| 中文字幕精品三区| 国产欧美日韩三级| 久久久久久久综合色一本| 欧美sm极限捆绑bd| 日韩视频一区二区在线观看| 国产视频亚洲色图| 日韩一区二区三区电影在线观看 | 国产精品美女久久久久av爽李琼| 亚洲精品在线免费观看视频| 欧美一区二区三区视频免费| 欧美日本一区二区三区四区| 在线精品视频免费观看| 日本乱人伦aⅴ精品| 欧美亚洲综合在线| 欧美私人免费视频| 欧美另类z0zxhd电影| 777奇米成人网| 欧美一区二区三区视频免费| 91精品国产乱码| 欧美一区二区三区视频| 日韩精品资源二区在线| 久久综合丝袜日本网| 国产无一区二区| 国产精品动漫网站| 亚洲宅男天堂在线观看无病毒| 亚洲第一主播视频| 日产国产欧美视频一区精品| 久久er99热精品一区二区| 国产精品99久| 99久久国产综合精品麻豆| 欧美调教femdomvk| 日韩欧美一卡二卡| 久久蜜臀精品av| 亚洲天堂久久久久久久| 亚洲国产精品麻豆| 精品一区二区在线视频| 粉嫩av一区二区三区在线播放 | 91精品国产综合久久国产大片| 91精品国产综合久久精品图片| 精品福利二区三区| 最新成人av在线| 日韩激情一区二区| 成人深夜福利app| 欧美日韩黄视频| 久久亚洲欧美国产精品乐播| 亚洲乱码中文字幕综合| 日韩av在线播放中文字幕| 国产盗摄女厕一区二区三区| 日本韩国欧美一区| 欧美精品一区二| 亚洲欧美激情在线| 美女视频黄a大片欧美| 99久久99久久综合| 日韩美女视频在线| 亚洲三级在线免费观看| 久久精品国产色蜜蜜麻豆| 成人aaaa免费全部观看| 欧美一级一级性生活免费录像| 成人免费一区二区三区视频 | av在线不卡观看免费观看| 在线播放日韩导航| 亚洲色图丝袜美腿| 国产在线精品一区二区不卡了 | 亚洲欧洲www| 美女一区二区在线观看| 在线亚洲欧美专区二区| 国产精品久久久久影视| 久色婷婷小香蕉久久| 欧美精品日韩精品|