日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv函数findcontours_OpenCV系列之轮廓入门 | 二十一

發(fā)布時(shí)間:2023/12/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv函数findcontours_OpenCV系列之轮廓入门 | 二十一 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目標(biāo)

  • 了解輪廓是什么。
  • 學(xué)習(xí)查找輪廓,繪制輪廓等。
  • 你將看到以下功能:cv.findContours(),cv.drawContours()

什么是輪廓?

輪廓可以簡單地解釋為連接具有相同顏色或強(qiáng)度的所有連續(xù)點(diǎn)(沿邊界)的曲線。輪廓是用于形狀分析以及對(duì)象檢測和識(shí)別的有用工具。
  • 為了獲得更高的準(zhǔn)確性,請(qǐng)使用二進(jìn)制圖像。因此,在找到輪廓之前,請(qǐng)應(yīng)用閾值或canny邊緣檢測。
  • 從OpenCV 3.2開始,findContours()不再修改源圖像。
  • 在OpenCV中,找到輪廓就像從黑色背景中找到白色物體。因此請(qǐng)記住,要找到的對(duì)象應(yīng)該是白色,背景應(yīng)該是黑色。
讓我們看看如何找到二進(jìn)制圖像的輪廓:import?numpy?as?npimport?cv2?as?cvim?=?cv.imread('test.jpg')imgray?=?cv.cvtColor(im,?cv.COLOR_BGR2GRAY)ret,?thresh?=?cv.threshold(imgray,?127,?255,?0)contours,?hierarchy?=?cv.findContours(thresh,?cv.RETR_TREE,?cv.CHAIN_APPROX_SIMPLE)findcontour()函數(shù)中有三個(gè)參數(shù),第一個(gè)是源圖像,第二個(gè)是輪廓檢索模式,第三個(gè)是輪廓逼近方法。輸出等高線和層次結(jié)構(gòu)。輪廓是圖像中所有輪廓的Python列表。每個(gè)單獨(dú)的輪廓是一個(gè)(x,y)坐標(biāo)的Numpy數(shù)組的邊界點(diǎn)的對(duì)象。注意稍后我們將詳細(xì)討論第二和第三個(gè)參數(shù)以及有關(guān)層次結(jié)構(gòu)。在此之前,代碼示例中賦予它們的值將適用于所有圖像。

如何繪制輪廓?

要繪制輪廓,請(qǐng)使用cv.drawContours函數(shù)。只要有邊界點(diǎn),它也可以用來繪制任何形狀。它的第一個(gè)參數(shù)是源圖像,第二個(gè)參數(shù)是應(yīng)該作為Python列表傳遞的輪廓,第三個(gè)參數(shù)是輪廓的索引(在繪制單個(gè)輪廓時(shí)有用。要繪制所有輪廓,請(qǐng)傳遞-1),其余參數(shù)是顏色,厚度等等

  • 在圖像中繪制所有輪廓:

    cv.drawContours(img,?contours,?-1,?(0,255,0),?3)

  • 繪制單個(gè)輪廓,如第四個(gè)輪廓:

    cv.drawContours(img,?contours,?3,?(0,255,0),?3)?

  • 但是在大多數(shù)情況下,以下方法會(huì)很有用:

    cnt?=?contours[4]cv.drawContours(img,?[cnt],?0,?(0,255,0),?3)

注意最后兩種方法相似,但是前進(jìn)時(shí),您會(huì)發(fā)現(xiàn)最后一種更有用。

輪廓近似方法

這是cv.findContours函數(shù)中的第三個(gè)參數(shù)。它實(shí)際上表示什么?上面我們告訴我們輪廓是強(qiáng)度相同的形狀的邊界。它存儲(chǔ)形狀邊界的(x,y)坐標(biāo)。但是它存儲(chǔ)所有坐標(biāo)嗎?這是通過這種輪廓近似方法指定的。如果傳遞cv.CHAIN_APPROX_NONE,則將存儲(chǔ)所有邊界點(diǎn)。但是實(shí)際上我們需要所有這些要點(diǎn)嗎?例如,您找到了一條直線的輪廓。您是否需要線上的所有點(diǎn)來代表該線?不,我們只需要該線的兩個(gè)端點(diǎn)即可。這就是cv.CHAIN_APPROX_SIMPLE所做的。它刪除所有冗余點(diǎn)并壓縮輪廓,從而節(jié)省內(nèi)存。下面的矩形圖像演示了此技術(shù)。只需在輪廓數(shù)組中的所有坐標(biāo)上繪制一個(gè)圓(以藍(lán)色繪制)。第一幅圖像顯示了我用cv.CHAIN_APPROX_NONE獲得的積分(734個(gè)點(diǎn)),第二幅圖像顯示了我用cv.CHAIN_APPROX_SIMPLE獲得的效果(只有4個(gè)點(diǎn))。看,它可以節(jié)省多少內(nèi)存!!!

☆☆☆為方便大家查閱,小編已將OpenCV-Python專欄文章統(tǒng)一整理到公眾號(hào)底部菜單欄,同步更新中,關(guān)注公眾號(hào),點(diǎn)擊左下方“文章”,如圖:

? ? ?不斷更新資源

? ?? 獲取更多精彩

長按二維碼掃碼關(guān)注

總結(jié)

以上是生活随笔為你收集整理的opencv函数findcontours_OpenCV系列之轮廓入门 | 二十一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。