0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

我們?nèi)绾味xROI?

新機(jī)器視覺 ? 來(lái)源:小白學(xué)視覺 ? 作者:努比 ? 2022-06-09 11:12 ? 次閱讀

OpenCV是一個(gè)巨大的開源庫(kù),廣泛用于計(jì)算機(jī)視覺,人工智能和圖像處理領(lǐng)域。它在現(xiàn)實(shí)世界中的典型應(yīng)用是人臉識(shí)別,物體檢測(cè),人類活動(dòng)識(shí)別,物體跟蹤等。

現(xiàn)在,假設(shè)我們只需要從整個(gè)輸入幀中檢測(cè)到一個(gè)對(duì)象。因此,代替處理整個(gè)框架,如果可以在框架中定義一個(gè)子區(qū)域并將其視為要應(yīng)用處理的新框架,該怎么辦。我們要完成一下三個(gè)步驟:

?定義興趣區(qū)

?在ROI中檢測(cè)輪廓

?閾值檢測(cè)輪廓輪廓線

什么是ROI?

簡(jiǎn)而言之,我們感興趣的對(duì)象所在的幀內(nèi)的子區(qū)域稱為感興趣區(qū)域(ROI)。

我們?nèi)绾味xROI?

在輸入幀中定義ROI的過(guò)程稱為ROI分割。

在“ ROI細(xì)分”中,(此處)我們選擇框架中的特定區(qū)域,并以矩形方法提供其尺寸,以便它將在框架上繪制矩形的ROI。

1934a0e2-e731-11ec-ba43-dac502259ad0.png

(輸出)藍(lán)色矩形覆蓋的區(qū)域是我們的投資回報(bào)率

現(xiàn)在,如果您也想綁定感興趣的對(duì)象,那么我們可以通過(guò)在ROI中找到輪廓來(lái)實(shí)現(xiàn)。

什么是輪廓?

輪廓線是表示或說(shuō)是限制對(duì)象形狀的輪廓。

如何在框架中找到輪廓?

對(duì)我而言,在將ROI框架設(shè)為閾值后,找到輪廓效果最佳。因此,要找到輪廓,手上的問(wèn)題是-

什么是閾值?

閾值不過(guò)是圖像分割的一種簡(jiǎn)單形式。這是將灰度或rgb圖像轉(zhuǎn)換為二進(jìn)制圖像的過(guò)程。例如

198779c0-e731-11ec-ba43-dac502259ad0.png

(這是RGB幀)

19acae20-e731-11ec-ba43-dac502259ad0.png

(這是二進(jìn)制閾值幀)

因此,在對(duì)rgb幀進(jìn)行閾值處理后,程序很容易找到輪廓,因?yàn)橛捎赗OI中感興趣對(duì)象的顏色將是黑色(在簡(jiǎn)單的二進(jìn)制脫粒中)或白色(在如上所述的反向二進(jìn)制脫粒中),因此分割(將背景與前景即我們的對(duì)象分開)將很容易完成。

在對(duì)框架進(jìn)行閾值處理并檢測(cè)到輪廓之后,我們應(yīng)用凸包技術(shù)對(duì)圍繞對(duì)象點(diǎn)的緊密擬合凸邊界進(jìn)行設(shè)置。實(shí)施此步驟后,框架應(yīng)如下所示-

19ce95f8-e731-11ec-ba43-dac502259ad0.png

我們可以做的另一件事是,我們可以遮蓋ROI以僅顯示被檢測(cè)到的輪廓本身覆蓋的對(duì)象。再次-

什么是圖像MASK?

圖像MASK是隱藏圖像的某些部分并顯示某些部分的過(guò)程。這是圖像編輯的非破壞性過(guò)程。在大多數(shù)情況下,它使您可以在以后根據(jù)需要調(diào)整和調(diào)整遮罩。通常,它是一種有效且更具創(chuàng)意的圖像處理方式。

因此,基本上在這里我們將掩蓋ROI的背景。為此,首先我們將修復(fù)ROI的背景。然后,在固定背景之后,我們將從框架中減去背景,并用wewant背景(這里是一個(gè)簡(jiǎn)單的黑色框架)替換它。

實(shí)施上述技術(shù),我們應(yīng)該得到如下輸出:

19f5abd4-e731-11ec-ba43-dac502259ad0.png

(背景被遮罩以僅捕獲對(duì)象)

這是所說(shuō)明技術(shù)的理想實(shí)現(xiàn)的完整代碼。


import cv2import numpy as npimport copyimport math
x=0.5  # start point/total widthy=0.8  # start point/total widththreshold = 60  # BINARY thresholdblurValue = 7  # GaussianBlur parameterbgSubThreshold = 50learningRate = 0
# variablesisBgCaptured = 0   # whether the background captured
def removeBG(frame): #Subtracting the background    fgmask = bgModel.apply(frame,learningRate=learningRate)
    kernel = np.ones((3, 3), np.uint8)    fgmask = cv2.erode(fgmask, kernel, iterations=1)    res = cv2.bitwise_and(frame, frame, mask=fgmask)    return res
# Cameracamera = cv2.VideoCapture(0)camera.set(10,200)


while camera.isOpened():    ret, frame = camera.read()    frame = cv2.bilateralFilter(frame, 5, 50, 100)  # smoothening filter    frame = cv2.flip(frame, 1)  # flip the frame horizontally    cv2.rectangle(frame, (int(x * frame.shape[1]), 0),                 (frame.shape[1], int(y * frame.shape[0])), (255, 0, 0), 2) #drawing ROI    cv2.imshow('original', frame)
    #  Main operation    if isBgCaptured == 1:  # this part wont run until background captured        img = removeBG(frame)        img = img[0:int(y * frame.shape[0]),                    int(x * frame.shape[1]):frame.shape[1]]  # clip the ROI        cv2.imshow('mask', img)
        # convert the image into binary image        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)        blur = cv2.GaussianBlur(gray, (blurValue, blurValue), 0)        cv2.imshow('blur', blur)        ret, thresh = cv2.threshold(blur, threshold, 255, cv2.THRESH_BINARY) #thresholding the frame        cv2.imshow('ori', thresh)

        # get the coutours        thresh1 = copy.deepcopy(thresh)        contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #detecting contours        length = len(contours)        maxArea = -1        if length > 0:            for i in range(length):  # find the biggest contour (according to area)                temp = contours[i]                area = cv2.contourArea(temp)                if area > maxArea:                    maxArea = area                    ci = i
            res = contours[ci]            hull = cv2.convexHull(res) #applying convex hull technique            drawing = np.zeros(img.shape, np.uint8)            cv2.drawContours(drawing, [res], 0, (0, 255, 0), 2) #drawing contours             cv2.drawContours(drawing, [hull], 0, (0, 0, 255), 3) #drawing convex hull            cv2.imshow('output', drawing)
    # Keyboard OP    k = cv2.waitKey(10)    if k == 27:          camera.release()        cv2.destroyAllWindows()        break    elif k == ord('b'):  # press 'b' to capture the background        bgModel = cv2.createBackgroundSubtractorMOG2(0, bgSubThreshold)        isBgCaptured = 1        print( 'Background Captured')    elif k == ord('r'):  # press 'r' to reset the background        bgModel = None        isBgCaptured = 0print('ResetBackGround')

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 人臉識(shí)別
    +關(guān)注

    關(guān)注

    76

    文章

    3998

    瀏覽量

    81364
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    622

    瀏覽量

    41091

原文標(biāo)題:基于OpenCV的區(qū)域分割、輪廓檢測(cè)和閾值處理

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GPT的定義和演進(jìn)歷程

    GPT,全稱Generative Pretrained Transformer,是OpenAI公司在自然語(yǔ)言處理(NLP)領(lǐng)域的一項(xiàng)重大創(chuàng)新。這一模型不僅推動(dòng)了AI技術(shù)的邊界,還深刻影響了我們與機(jī)器交互的方式。本文將從GPT的定義、來(lái)源、演進(jìn)歷程以及其在各個(gè)領(lǐng)域的應(yīng)用和影
    的頭像 發(fā)表于 07-10 10:41 ?591次閱讀

    為什么我們需要軟件定義的工廠?

    軟件定義的工廠使制造商能夠快速響應(yīng)市場(chǎng)趨勢(shì)并減少計(jì)劃外停機(jī)時(shí)間,從而提高工廠的生產(chǎn)力。 在工業(yè)4.0時(shí)代保持競(jìng)爭(zhēng)力意味著制造商必須足夠靈活,以設(shè)計(jì)選擇,并能夠改變生產(chǎn)工藝,以滿足不同的客戶偏好或獨(dú)特
    的頭像 發(fā)表于 07-03 14:34 ?1906次閱讀

    變量的聲明和定義有什么區(qū)別和聯(lián)系

    變量的聲明和定義是編程中的兩個(gè)重要概念,它們?cè)谡Z(yǔ)法和語(yǔ)義上有一些區(qū)別和聯(lián)系。在本文中,我將詳細(xì)介紹變量的聲明和定義之間的區(qū)別和聯(lián)系。 首先,讓我們從變量的定義開始。變量的
    的頭像 發(fā)表于 12-07 16:14 ?837次閱讀

    oracle sql 定義變量并賦值

    在Oracle SQL中,變量是用來(lái)存儲(chǔ)數(shù)據(jù)值的標(biāo)識(shí)符。通過(guò)定義和使用變量,我們可以在SQL語(yǔ)句中使用它們來(lái)存儲(chǔ)和處理數(shù)據(jù),從而實(shí)現(xiàn)更靈活和動(dòng)態(tài)的查詢和操作。 在Oracle SQL中,定義變量并
    的頭像 發(fā)表于 12-06 10:46 ?2071次閱讀

    話題通信接口的定義和運(yùn)行效果

    話題接口的定義與使用 話題通信接口的定義也是類似的,繼續(xù)從之前的機(jī)器視覺案例中來(lái)衍生,我們想把服務(wù)換成話題,周期發(fā)布目標(biāo)識(shí)別的位置,不管有沒有人需要。 運(yùn)行效果 現(xiàn)在我們會(huì)運(yùn)行三個(gè)節(jié)點(diǎn)
    的頭像 發(fā)表于 12-01 15:32 ?316次閱讀
    話題通信接口的<b class='flag-5'>定義</b>和運(yùn)行效果

    服務(wù)通信接口的定義與使用

    了解了通信接口的概念,接下來(lái)我們再?gòu)拇a實(shí)現(xiàn)的角度,研究下如何定義以及使用一個(gè)接口。 在之前服務(wù)概念講解的課程中,我們編寫了這樣一個(gè)例程,我們再來(lái)回顧下。 有三個(gè)節(jié)點(diǎn): 第一個(gè)驅(qū)動(dòng)相機(jī)
    的頭像 發(fā)表于 12-01 15:28 ?349次閱讀
    服務(wù)通信接口的<b class='flag-5'>定義</b>與使用

    接口的定義 通信接口的作用

    ?為了讓大家都好理解,我們可以給傳遞的數(shù)據(jù)定義一個(gè)標(biāo)準(zhǔn)的結(jié)構(gòu),這就是通信接口。 接口的定義 接口的概念在各個(gè)領(lǐng)域隨處可見,無(wú)論是硬件結(jié)構(gòu)還是軟件開發(fā),都有廣泛的應(yīng)用。 比如生活中最為常見的插頭和插座,兩者必須匹配才能使用
    的頭像 發(fā)表于 12-01 14:59 ?619次閱讀

    機(jī)器人模型其他關(guān)節(jié)的定義

    base_link的定義 base_link是所有的其他關(guān)節(jié)的基礎(chǔ),也就是基坐標(biāo)系所在的link。 這里他的幾何圖形我們直接引用他的dae文件,至于如何用Solidworks繪制模型然后制作成dae
    的頭像 發(fā)表于 11-28 14:27 ?348次閱讀

    define宏定義

    define宏定義 以#號(hào)開頭的都是編譯預(yù)處理指令,它們不是C語(yǔ)言的成分,但是C程序離不開它們,#define用來(lái)定義一個(gè)宏,程序在預(yù)處理階段將用define定義的來(lái)內(nèi)容進(jìn)行了替換。因此在程序運(yùn)行時(shí)
    的頭像 發(fā)表于 11-24 15:35 ?651次閱讀

    OpenCV初學(xué)者如何提取這些不規(guī)則的ROI區(qū)域

    ROI是英文Region Of Interest的三個(gè)首字母縮寫,很多時(shí)候我們對(duì)圖像的分析就是對(duì)圖像特定ROI的分析與理解,對(duì)細(xì)胞與醫(yī)療圖像來(lái)說(shuō),ROI提取正確才可以進(jìn)行后續(xù)的分析、測(cè)
    的頭像 發(fā)表于 10-31 14:51 ?767次閱讀

    相位噪聲的頻譜定義與測(cè)試方法

    來(lái)對(duì)信號(hào)進(jìn)行評(píng)估是常見的方法之一,本文將會(huì)介紹相位噪聲的頻譜定義與測(cè)試方法。 相位噪聲的頻譜定義 首先我們需要了解噪聲的概念。噪聲是指信號(hào)中的非期望部分。在信號(hào)處理中,我們不可避免地會(huì)
    的頭像 發(fā)表于 10-22 12:43 ?767次閱讀

    static定義內(nèi)部類

    1. static定義內(nèi)部類 1.1 static定義內(nèi)部類 如果說(shuō)現(xiàn)在內(nèi)部類上使用了static定義,那么這個(gè)內(nèi)部類就變成了“外部類”,static定義的都是獨(dú)立于類的結(jié)構(gòu),所以該類
    的頭像 發(fā)表于 10-10 16:08 ?460次閱讀

    python定義函數(shù)與調(diào)用函數(shù)的順序

    定義函數(shù)與調(diào)用函數(shù)的順序 函數(shù)被定義后,本身是不會(huì)自動(dòng)執(zhí)行的,只有在被調(diào)用后,函數(shù)才會(huì)被執(zhí)行,得到相應(yīng)的結(jié)果。但是在 Python 中我們要注意一個(gè)關(guān)鍵點(diǎn),就是Python不允許前向引用,即在函數(shù)
    的頭像 發(fā)表于 10-04 17:17 ?1037次閱讀

    Dockerfile定義Docker鏡像的構(gòu)建過(guò)程

    了解Dockerfile Dockerfile 是一個(gè)文本文件,用于定義 Docker 鏡像的構(gòu)建過(guò)程。它以指令的形式描述了如何構(gòu)建鏡像,從基礎(chǔ)鏡像開始逐步添加配置、文件和依賴,最終形成我們所需
    的頭像 發(fā)表于 09-30 10:22 ?2388次閱讀

    PCIe引腳定義和PCIe協(xié)議層介紹

    本文我們將向大家介紹PCIe引腳定義以及PCIe協(xié)議層。
    發(fā)表于 09-26 11:39 ?1.4w次閱讀
    PCIe引腳<b class='flag-5'>定義</b>和PCIe協(xié)議層介紹