深入探究cv2.findcontours返回值

一、返回值概述

cv2.findcontours函數用於檢測二值圖像中的輪廓。這個函數返回三個參數,分別是:

image, contours, hierarchy = cv2.findContours(image, mode, method)

其中,image是輸入的二值圖像;contours是一個列表,其中包含檢測出來的輪廓;hierarchy描述了輪廓之間的關係。

二、contours參數詳解

上面提到,contours是一個列表,其中包含檢測出來的輪廓。每一個輪廓都是由一系列點組成的,可以使用cv2.drawContours函數將其畫出。但是在實際應用中,我們還需要進一步了解這個contours參數。

首先,我們可以通過len(contours)來獲取圖像中的輪廓數量,也可以使用cv2.drawContours函數畫出指定的輪廓。假設我們想要畫出第二個輪廓,代碼如下:

cv2.drawContours(img, [contours[1]], -1, (0,255,0), 3)

如果想要獲取第一個輪廓的面積,可以使用cv2.contourArea函數。同理,我們還可以獲取輪廓的周長(cv2.arcLength)、邊界矩形(cv2.boundingRect)、最小閉合圓(cv2.minEnclosingCircle)等信息。

三、hierarchy參數詳解

在返回值中,hierarchy描述了輪廓之間的關係。hierarchy是一個形狀和contours一樣的多維數組,每一行的元素有四個分量,分別表示後一個輪廓、前一個輪廓、父輪廓和內部輪廓。如果當前輪廓沒有對應的後一個、前一個、父輪廓或內部輪廓,那麼對應分量的值為-1。

對於複雜的輪廓,在使用cv2.drawContours函數時,我們可以通過注釋掉一部分代碼,只畫出特定的輪廓。如果想畫出所有的輪廓,可以使用以下代碼:

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

如果想提取某一個輪廓的所有子輪廓,可以使用hierarchy參數。以下是獲取第一個輪廓的子輪廓的示例代碼:

child_ids = hierarchy[0,:,2]
child_contours = [contours[i] for i in child_ids if i != -1]

四、輪廓近似

cv2.findContours返回的輪廓是由一系列點組成的,但是實際應用中,我們往往需要將輪廓進行近似,以便用更少的點來表示輪廓。這個近似過程可以通過cv2.approxPolyDP實現,它需要兩個參數:輸入的輪廓和近似程度(epsilon)。近似的結果是一系列點,可以使用cv2.drawContours函數將其畫出。

以下是進行近似的示例代碼:

epsilon = 0.01 * cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], epsilon, True)
cv2.drawContours(img, [approx], -1, (0, 0, 255), 3)

五、輪廓特徵提取

在檢測輪廓時,如果我們想要進行輪廓匹配或者分類,那麼需要從輪廓中提取一些特徵。常見的特徵包括:輪廓面積、周長、重心、邊界框、外接圓、最大直徑等。以下是獲取輪廓面積和周長的示例代碼:

area = cv2.contourArea(contours[0])
perimeter = cv2.arcLength(contours[0], True)

需要注意的是,這些特徵提取函數都需要傳入輪廓作為參數。

六、小結

本文深入探究了cv2.findContours函數返回值中的contours和hierarchy參數,並且介紹了輪廓近似和輪廓特徵提取。通過這些知識點,我們可以更好地理解輪廓檢測的原理,並且在實際應用中更加靈活地使用輪廓。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/185313.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-26 12:17
下一篇 2024-11-26 12:17

相關推薦

  • Python無參無返回值函數示例

    本文將以Python語言為中心,介紹無參無返回值函數的基本概念和用法。無參無返回值函數是指不需要傳遞參數,也不需要返回值的函數,主要用於執行特定的任務或操作。下面,我們將從以下幾個…

    編程 2025-04-27
  • Python中return返回值返回給誰?

    對於python開發人員來說,return語句是必不可少的一部分。通過return語句,我們可以把函數執行的結果返回給調用者。那麼return返回值返回給誰呢?在本文中,我們將從多…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • Python返回值return用法詳解

    一、return的概念 在Python中,函數的返回值是使用return語句來控制的。return語句用於從函數中返回一個值,當函數執行到return語句時,函數會立即停止執行,並…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入理解Python字元串r

    一、r字元串的基本概念 r字元串(raw字元串)是指在Python中,以字母r為前綴的字元串。r字元串中的反斜杠(\)不會被轉義,而是被當作普通字元處理,這使得r字元串可以非常方便…

    編程 2025-04-25

發表回復

登錄後才能評論