OpenCV輪廓檢測

一、簡介

OpenCV是一個強大且流行的計算機視覺庫,廣泛應用於各種領域,如機械人、安防、自動駕駛、醫療等。OpenCV提供了許多函數和算法來處理圖像和視頻的問題,而輪廓檢測是其中之一。輪廓是由圖像中的連續點組成的曲線,其表示了這個物體的邊界。輪廓檢測可以在計算機視覺領域中起到非常重要的作用,例如圖像分割、物體識別、運動跟蹤、手勢識別等。

二、基本函數

OpenCV提供了許多輪廓檢測的函數,其中最常用的函數是findContours()。該函數可用於在二進制圖像中找到所有的輪廓。該函數返回的結果是一組點的列表,每個列表代表一個輪廓。在使用findContours()函數之前,我們需要將圖像轉換為二進制圖像,即使得背景為黑色,物體為白色的圖像。接下來是 findContours()函數的基本使用:

import cv2
img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0,0,255), 3)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代碼展示了如何使用findContours()函數來檢測圖像的輪廓。首先讀入一張圖像,將其轉換為灰度圖像,然後將灰度圖像轉換為二進制圖像。接着使用findContours()函數找到圖像中所有的輪廓,繪製出所有輪廓,並將結果打印出來。

三、檢測模式

1. RETR_EXTERNAL

該模式只檢測最外層的輪廓,忽略不在外部的輪廓。

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0,0,255), 3)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. RETR_TREE

該模式會檢測所有的輪廓,並且將其組合成一個樹形結構,每個輪廓都有一個父輪廓和子輪廓。

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for i in range(len(contours)):
    if hierarchy[0][i][3] == -1:
        cv2.drawContours(img, contours, i, (0, 255, 0), 2)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代碼展示了如何使用RETR_TREE模式檢測圖像的輪廓,並展示了如何訪問輪廓的層次結構。

四、逼近方法

逼近方法是指我們可以用一條直線或一個多邊形來逼近一個輪廓。這對於降低計算量和壓縮數據是非常有用的。OpenCV提供了多種逼近方法,包括:

  • cv2.CHAIN_APPROX_NONE:存儲所有的邊界點
  • cv2.CHAIN_APPROX_SIMPLE:只存儲拐角點
  • cv2.CHAIN_APPROX_TC89_L1
  • cv2.CHAIN_APPROX_TC89_KCOS

1. cv2.CHAIN_APPROX_NONE

使用cv2.CHAIN_APPROX_NONE模式,可以檢測出圖像的所有輪廓點。下面是代碼示例:

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0,255,0), 3)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. cv2.CHAIN_APPROX_SIMPLE

使用cv2.CHAIN_APPROX_SIMPLE模式,只保存重要的拐角點,可以大大減小存儲空間。下面是代碼示例:

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0,255,0), 3)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. cv2.approxPolyDP()

除了cv2.CHAIN_APPROX_SIMPLE以外,我們還可以使用cv2.approxPolyDP()函數對輪廓進行逼近。該函數會將輪廓逼近為一條直線或一組多邊形。下面是代碼示例:

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

for cnt in contours:
    epsilon = 0.01 * cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, epsilon, True)
    cv2.drawContours(img, [approx], 0, (0,255,0), 3)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

五、結論

本文詳細介紹了OpenCV輪廓檢測的基本函數、檢測模式和逼近方法。輪廓檢測是計算機視覺中常用的技術之一,可以用於圖像分割、物體識別、運動跟蹤、手勢識別等。通過本文的介紹,讀者可以掌握OpenCV輪廓檢測的基本原理和常用方法,為計算機視覺的研究和應用提供幫助。

原創文章,作者:IZEHL,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370801.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IZEHL的頭像IZEHL
上一篇 2025-04-22 01:14
下一篇 2025-04-22 01:14

相關推薦

  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • Opencv 實現讀取 BMP 圖片

    Opencv 是一個基於 C/C++ 語言的開源計算機視覺庫,可以用於圖像處理、特徵識別、目標跟蹤、機器學習等領域。在圖像處理中,讀取 BMP 圖片是常見操作之一。 一、打開 BM…

    編程 2025-04-27
  • opencv鼠標繪圖

    本文將為您詳細介紹如何使用opencv在原始圖片上進行鼠標繪圖。 一、準備工作 在開始繪製之前,您需要先準備好以下的工作: 1、安裝opencv庫,可以通過pip install …

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

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

    編程 2025-04-25
  • OpenCV的全面介紹

    OpenCV是一款強大的開源計算機視覺庫,它包含了各種用於圖像和視頻處理,圖像識別和機器學習的函數,它可以用於開發實時的計算機視覺軟件和系統,特別適用於圖像處理、物體識別、人臉識別…

    編程 2025-04-25
  • Opencv CUDA編譯用法介紹

    本文將從多個方面對Opencv CUDA編譯進行詳細的闡述和解讀。通過以下小標題,我們將詳細介紹如何進行編譯。 一、環境搭建 在使用CUDA進行加速之前,需要進行CUDA的環境搭建…

    編程 2025-04-25
  • 詳解OpenCV高斯濾波

    一、高斯濾波的介紹 OpenCV高斯濾波是一種平滑圖像的處理方法,通常用於去除噪聲、模糊化圖像等。它的原理是利用高斯函數進行加權平均,從而減少噪聲的干擾。 在圖像處理中,噪聲是一種…

    編程 2025-04-25
  • Clion配置OpenCV

    Clion是一個功能強大的跨平台集成開發環境,但要開發圖像處理、計算機視覺等相關領域應用,需要將OpenCV集成到Clion中,才能方便地進行開發。本文將介紹如何在Clion中配置…

    編程 2025-04-24
  • OpenCV之cv2.imshow()

    一、cv2.imshow()介紹 cv2.imshow()是OpenCV中顯示圖像的主要函數之一。它可以顯示傳遞給它的圖像窗口,或者將圖像作為選定窗口的內容。cv2.imshow(…

    編程 2025-04-24

發表回復

登錄後才能評論