OpenCV學習筆記(12)——OpenCV中的輪廓


  • 什么是輪廓
  • 找輪廓、繪制輪廓等

1.什么是輪廓

  輪廓可看做將連續的點(連着邊界)連在一起的曲線,具有相同的顏色和灰度。輪廓在形態分析和物體的檢測和識別中很有用。

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

讓我們看看如何在一個二值圖像中查找輪廓:

  cv2.findContours()有3個參數,第一個是輸入圖像,第二個是輪廓檢索模式,第三個是輪廓近似方法。返回值有三個,第一個是圖像,第二個是輪廓,第三個是(輪廓的)層析結構。第二個返回值輪廓是一個Python列表,其中存儲這圖像中的所有輪廓。每一個輪廓都是一個Numpy數組,包含對象邊界點(x,y)的坐標。

 

2.怎樣繪制輪廓

  cv2.drawContour()可以用來繪制輪廓。你可以根據你提供的邊界點繪制任何形狀。它的第一個參數是原始 圖像,第二個參數是輪廓,一個Python列表。第三個參數是輪廓的索引(在繪制獨立輪廓時相當有用,當設置為-1時將繪制所有輪廓)。接下來的參數是輪廓的顏色,厚度等。

  一下例程在一幅圖中繪制所有的輪廓:

 

# -*- coding:utf-8 -*-

import numpy as np
import cv2
from matplotlib import pyplot as plt

im = cv2.imread('2.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,200,255,cv2.THRESH_BINARY_INV)
cv2.imshow('img1',thresh)

img,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#以上設置是較為通用的用法,后面會講到一些具體的設置參數
#這一步會把thresh變為輪廓圖,即與img相同;然而不斷試驗並沒發現thresh發生任何變化
#網上有說這個函數只有兩個返回值的,但試過會報錯

cv2.drawContours(im,contours,-1,(0,0,255),1)
#這一步會把輪廓線畫在im中

print(len(contours))#可以看到一共繪制出了多少個輪廓
cv2.imshow('img',im)
cv2.waitKey(0)

效果如下

 

3.輪廓的近似方法

  表示這個設置的是cv2;findCountours()的第三個參數。之前我們提到輪廓是一個形狀具有相同灰度值的邊界,它會存儲形狀邊界上所有的(x,y)坐標。但是需要將這所有的邊界點都存儲么?這就是這個設置參數改變的東西。

  這個參數如果設置為cv2.CHAIN_APPROX_NONE,則所有的邊界點都會被存儲。但是有的時候,比如邊界是一條直線的時候,我們並不需要這么多的點來表示直線,只需要這條直線的端點就夠了。這就是cv2.CHAIN_APPROX_SIMLE做的。它會把輪廓上的冗余點都去掉,以壓縮輪廓節省內存開支。

 

P.S 幾個參數的物理含義

cv2.findCountours():

 輸入的第二個參數表示輪廓的檢索模式,有四種(本文介紹的都是新的cv2接口):
    cv2.RETR_EXTERNAL表示只檢測外輪廓
    cv2.RETR_LIST檢測的輪廓不建立等級關系
    cv2.RETR_CCOMP建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內孔的邊界信息。如果內孔內還有一個連通物體,這個物體的邊界也在頂層。
    cv2.RETR_TREE建立一個等級樹結構的輪廓

   

    輸出的的參數中,

  hierarchy :這是一個ndarray,其中的元素個數和輪廓個數相同,每個輪廓contours[i]對應4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別表示后一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,則該值為負數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM