国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

opencv-python3 | cv2.findContours()檢測圖像中物體輪廓

這篇具有很好參考價(jià)值的文章主要介紹了opencv-python3 | cv2.findContours()檢測圖像中物體輪廓。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

什么是物體輪廓

輪廓可以簡單地理解為連接所有連續(xù)點(diǎn)(沿物體邊界)的曲線,這些點(diǎn)通常具有相同的顏色或強(qiáng)度。 輪廓在圖像分析中具有重要意義,是物體形狀分析和對象檢測和識(shí)別的有用工具,是理解圖像語義信息的重要依據(jù)。

cv2.findContours

通常,為了提高物體輪廓檢測的準(zhǔn)確率,首先要將彩色圖像或者灰度圖像處理成二值圖像(黑白圖像)或者使用Canny邊緣檢測算法對原圖像進(jìn)行一次濾波處理,這樣可以在不丟失輪廓信息的前提下降低圖像語義信息的復(fù)雜度,更有助于我們準(zhǔn)確地分析物體輪廓。因此,在opencv里邊,尋找輪廓的過程更像是在黑色背景中尋找白色物體。
下邊是一段使用opencv-python里的cv2.findConttours()檢測物體輪廓的代碼。

import numpy as np
import cv2


im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

從上邊的代碼中,我們可以看到cv2.findContours()有三個(gè)參數(shù):thresh、cv2.RETR_TREE、cv2.CHAIN_APPROX_SIMPLE。

參數(shù)說明

  • thresh:圖像數(shù)據(jù)(二值圖像或經(jīng)過Canny算法處理之后的圖像)
  • cv2.RETR_TREE:輪廓檢索方式,還有cv2.RETR_LIST、cv2.RETR_EXTERNAL、cv2.RETR_CCOMP
  • cv2.CHAIN_APPROX_SIMPLE:輪廓的估計(jì)方法,除此之外還有 cv2.CHAIN_APPROX_NONE

第二個(gè)參數(shù)指定的不同輪廓檢索方法有什么區(qū)別呢?

輪廓檢索方法 作用
cv2.RETR_LIST 這是最簡單的一種尋找方式,它不建立輪廓間的子屬關(guān)系,也就是所有輪廓都屬于同一層級(jí)
cv2.RETR_TREE 完整建立輪廓的層級(jí)從屬關(guān)系
cv2.RETR_EXTERNAL 只尋找最高層級(jí)的輪廓
cv2.RETR_CCOMP 把所有的輪廓只分為2個(gè)層級(jí),不是外層的就是里層的

詳情請參考 cv2.findContours()的輪廓層級(jí)關(guān)系.

前邊說了物體輪廓是具有相同灰度值的形狀的邊界。它是以形狀邊界上的點(diǎn)的坐標(biāo)(x,y)儲(chǔ)存的,但是cnts里邊是儲(chǔ)存了邊界上所有點(diǎn)的坐標(biāo)嗎?還是只儲(chǔ)存了個(gè)別點(diǎn)的坐標(biāo)?這是由第三個(gè)參數(shù)輪廓的估計(jì)方法指定的。如果傳遞 cv2.CHAIN_APPROX_NONE,則存儲(chǔ)所有邊界點(diǎn)。 但實(shí)際上我們需要所有的點(diǎn)嗎? 例如,您找到了一條直線的輪廓。 你需要線上的所有點(diǎn)來代表那條線嗎? 不,我們只需要那條線的兩個(gè)端點(diǎn)。 這就是 cv.CHAIN_APPROX_SIMPLE 所做的。 它去除所有冗余點(diǎn)并壓縮輪廓,從而節(jié)省內(nèi)存。如圖1所示。
opencv-python3 | cv2.findContours()檢測圖像中物體輪廓
      圖1. 不同輪廓估計(jì)方法的效果圖

cv2.findContours()返回了兩個(gè)變量:contours, hierarchy。

輸出變量說明

  • contours:一個(gè)包含了圖像中所有輪廓的list對象。其中每一個(gè)獨(dú)立的輪廓信息以邊界點(diǎn)坐標(biāo)(x,y)的形式儲(chǔ)存在numpy數(shù)組中。
  • hierarchy:一個(gè)包含4個(gè)值的數(shù)組:[Next, Previous, First Child, Parent]。
    Next:與當(dāng)前輪廓處于同一層級(jí)的下一條輪廓
    Previous:與當(dāng)前輪廓處于同一層級(jí)的上一條輪廓
    First Child:當(dāng)前輪廓的第一條子輪廓
    Parent:當(dāng)前輪廓的父輪廓
    因?yàn)橐话悴皇褂胔ierarchy,所以這里不討論輪廓的層級(jí)關(guān)系,想深入研究的朋友請移步:cv2.findContours()的輪廓層級(jí)關(guān)系.

cv2.drawContours

計(jì)算得到圖像中物體輪廓之后,我們需要將輪廓在圖像中繪制出來才能更直觀地體驗(yàn)到。這時(shí)候需要用到cv2.drawContours()方法。它的第一個(gè)參數(shù)是圖像,第二個(gè)參數(shù)是儲(chǔ)存輪廓信息的python 列表,第三個(gè)參數(shù)是輪廓的索引(在繪制單個(gè)輪廓時(shí)很有用。要繪制所有輪廓,傳遞 -1),其余參數(shù)是顏色、厚度 等等。

繪制檢索到的所有輪廓

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

繪制檢索到的所有輪廓中的第四個(gè)

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

但是更多時(shí)候我們使用下邊這種方法繪制單獨(dú)的某一個(gè)輪廓。

第二種方法繪制檢索到的所有輪廓中的第四個(gè)

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

代碼示例

import cv2
import imutils
import numpy as np

# 讀取圖片
img_dir = r'C:\Users\Lei\Desktop\8.jpg'
img = cv2.imread(img_dir)
# 圖像預(yù)處理
img = imutils.resize(img, height=500)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
binary = cv2.Canny(gray, 30, 120)
# 輪廓檢索
contours, hierarchy = cv2.findContours(binary,
                                       cv2.RETR_EXTERNAL,
                                       cv2.CHAIN_APPROX_SIMPLE)

cv2.imshow('origin', img)
if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyWindow('origin')

cv2.imshow('binary', binary)
if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyWindow('binary')

# 輪廓過濾以及繪制
draw_img = img.copy()
for i in range(len(contours)):
    # 篩掉面積過小的輪廓
    area = cv2.contourArea(contours[i])
    if area < 800:
        continue
    # 找到包含輪廓的最小矩形框
    rect = cv2.minAreaRect(contours[i])
    # 計(jì)算矩形框的四個(gè)頂點(diǎn)坐標(biāo)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    # 繪制輪廓
    cv2.drawContours(draw_img, [box], 0, (0, 0, 255), 5)


cv2.imshow('origin with contours', draw_img)
if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyWindow('origin with contours')

代碼中首先對讀取的RGB圖像(圖2)轉(zhuǎn)灰度圖,然后進(jìn)行高斯濾波去噪,再使用Canny算子進(jìn)行邊緣檢測得到黑白圖像(圖3)。對黑白圖像進(jìn)行輪廓檢索,檢索到的輪廓再根據(jù)cv2.contourArea()計(jì)算得到的面積大小進(jìn)行一次篩選,去掉因噪聲引起的檢測。根據(jù)檢測到的輪廓信息,使用cv2.minAreaRect()得到包含輪廓信息的最小矩形框rect,再使用cv2.boxPoints()計(jì)算出rect的四個(gè)頂點(diǎn)。最后,使用cv2.drawContours()繪制出rect(圖4)。
opencv-python3 | cv2.findContours()檢測圖像中物體輪廓
         圖2. RGB原圖像
opencv-python3 | cv2.findContours()檢測圖像中物體輪廓
       圖3. Canny算子得到的黑白圖像
opencv-python3 | cv2.findContours()檢測圖像中物體輪廓
      圖4. 使用矩形框顯示輪廓檢測結(jié)果文章來源地址http://www.zghlxwxcb.cn/news/detail-450975.html

到了這里,關(guān)于opencv-python3 | cv2.findContours()檢測圖像中物體輪廓的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 圖像識(shí)別問題 — cv2.error: OpenCV(4.5.4) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window

    圖像識(shí)別問題 — cv2.error: OpenCV(4.5.4) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window

    目錄 一、錯(cuò)誤原因 ????????1.1、報(bào)錯(cuò)背景 ????????1.2、報(bào)錯(cuò)信息: 二、解決方法 ????????2.1、卸載: ????????2.2、安裝: ????????1.1、報(bào)錯(cuò)背景 ? ? ? ? ????????這個(gè)報(bào)錯(cuò)來的一臉懵逼,因?yàn)檫@是在cv2.imshow()函數(shù)引發(fā)的錯(cuò)誤。十分鐘之前還能正常跑,

    2024年02月11日
    瀏覽(48)
  • Python cv2 opencv-python opencv-contrib-python 安裝

    老規(guī)矩,話不多說,上代碼! pip install opencv-python(如果只用主模塊,則使用這個(gè)命令安裝【推薦】) pip install opencv-contrib-python(如果需要用到 contrib 模塊,則使用這個(gè)命令【本次因自己沒有使用 contrib 模塊,所以沒有嘗試】) 首先,講一下 cv2 這個(gè)模塊是 opencv 的,所以安

    2024年02月11日
    瀏覽(24)
  • 【Python入門教程】CV2報(bào)錯(cuò):cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\s

    【Python入門教程】CV2報(bào)錯(cuò):cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\s

    ???????? OpenCV作為一個(gè)強(qiáng)大計(jì)算機(jī)視覺庫被各個(gè)領(lǐng)域廣泛應(yīng)用,今天分享下自己編程遇到的報(bào)錯(cuò)信息以及解決辦法。 ????????這里包含了一個(gè)警告和一個(gè)報(bào)錯(cuò)信息。 ??????? ?警告信息: OpenCV庫在處理TIFF圖像時(shí)遇到的問題有關(guān)。從警告信息來看,你的TIFF圖像可能使

    2024年02月08日
    瀏覽(41)
  • 【跟官網(wǎng)學(xué)opencv-python】筆記1.3:opencv鼠標(biāo)繪圖 cv2.setMouseCallback()

    【跟官網(wǎng)學(xué)opencv-python】筆記1.3:opencv鼠標(biāo)繪圖 cv2.setMouseCallback()

    目錄 前言 目標(biāo) 函數(shù)詳解 1、cv2.setMouseCallback()鼠標(biāo)回調(diào)函數(shù) 2、鼠標(biāo)事件簡介 代碼演示 ?編輯 應(yīng)用演示 運(yùn)行效果 參考 跟著官網(wǎng)學(xué)習(xí)才是基礎(chǔ)入門的最佳選擇,下文是opencv-python官網(wǎng)的學(xué)習(xí)記錄及擴(kuò)展! 學(xué)習(xí)函數(shù)cv2.setMouseCallback()并使用鼠標(biāo)繪制不同圖形(矩形、多邊形等)

    2024年02月03日
    瀏覽(19)
  • opencv-python 已安裝,但是import cv2仍舊失敗的原因

    opencv-python 已安裝,但是import cv2仍舊失敗的原因

    在終端和cmd中輸入以下命令pip install opencv-python 都會(huì)顯示opencv-python已安裝 注:用 pip install cv2安裝會(huì)顯示報(bào)錯(cuò) 大部分安裝失敗的原因都是安裝命令輸入錯(cuò)誤 ?其實(shí)是解釋器的問題 更換已安裝opencv的解釋器即可解決問題 本項(xiàng)目使用的解釋器位置如圖所示: ? 已安裝opencv的解釋

    2024年02月11日
    瀏覽(26)
  • opencv-python庫 cv2 圖形繪制 cv2.line()cv2.rectangle()cv2.circle()cv2.ellipse()cv2.polylines()cv2.putText

    cv2.line() 是 OpenCV 中的一個(gè)函數(shù),用于在圖像上繪制直線。這個(gè)函數(shù)需要指定圖像、線的起點(diǎn)和終點(diǎn)坐標(biāo)、線的顏色、線的寬度以及線的類型。 下面是 cv2.line() 函數(shù)的詳細(xì)參數(shù)說明: 參數(shù)解釋: 下面是一個(gè)使用 cv2.line() 繪制直線的簡單示例: 在這個(gè)例子中,我們創(chuàng)建了一個(gè)

    2024年04月23日
    瀏覽(100)
  • 【已解決】安裝cv2時(shí)Building wheel for opencv-python終端卡死

    【已解決】安裝cv2時(shí)Building wheel for opencv-python終端卡死

    環(huán)境: Ubuntu20.04 Python3.6 現(xiàn)象:終端輸出類似下面的命令,并卡住不動(dòng) 首先, OpenCV 較舊的Python版本不需要進(jìn)行滾輪編譯,因此造成編譯在 處停止。為了防止因?yàn)閜ip版本較舊引起干擾,首先運(yùn)行 更新 pip 版本,接著再次安裝 接著大概率能解決 Building wheel for opencv-python (PEP 51

    2024年02月03日
    瀏覽(19)
  • cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\……解決方案

    cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\……解決方案

    運(yùn)行opencv官網(wǎng)示例代碼facedetect.py 運(yùn)行以上代碼報(bào)以下錯(cuò)誤: 根據(jù)報(bào)錯(cuò)位置: 可以發(fā)現(xiàn)是\\\"haarcascade_frontalface_alt.xml\\\"和?\\\"data/haarcascades/haarcascade_eye.xml\\\"的文件路徑不對造成的。 \\\"haarcascade_frontalface_alt.xml\\\"和?\\\"data/haarcascades/haarcascade_eye.xml\\\"是在python安裝的cv2包下,將代碼中的路徑改

    2024年02月15日
    瀏覽(21)
  • opencv基礎(chǔ)57-模板匹配cv2.matchTemplate()->(目標(biāo)檢測、圖像識(shí)別、特征提取)

    opencv基礎(chǔ)57-模板匹配cv2.matchTemplate()->(目標(biāo)檢測、圖像識(shí)別、特征提取)

    OpenCV 提供了模板匹配(Template Matching)的功能,它允許你在圖像中尋找特定模板(小圖像)在目標(biāo)圖像中的匹配位置。模板匹配在計(jì)算機(jī)視覺中用于目標(biāo)檢測、圖像識(shí)別、特征提取等領(lǐng)域。 以下是 OpenCV 中使用模板匹配的基本步驟: 加載圖像 : 首先,加載目標(biāo)圖像和要匹配

    2024年02月13日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包