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

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

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

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

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

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

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

?定義興趣區(qū)

?在ROI中檢測輪廓

?閾值檢測輪廓輪廓線

什么是ROI?

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

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

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

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

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

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

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

什么是輪廓?

輪廓線是表示或說是限制對象形狀的輪廓。

如何在框架中找到輪廓?

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

什么是閾值?

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

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

(這是RGB幀)

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

(這是二進制閾值幀)

因此,在對rgb幀進行閾值處理后,程序很容易找到輪廓,因為由于ROI中感興趣對象的顏色將是黑色(在簡單的二進制脫粒中)或白色(在如上所述的反向二進制脫粒中),因此分割(將背景與前景即我們的對象分開)將很容易完成。

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

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

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

什么是圖像MASK?

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

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

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

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

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

這是所說明技術(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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 人臉識別
    +關(guān)注

    關(guān)注

    76

    文章

    4014

    瀏覽量

    82084
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41420

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    const定義的是不是常量

    C語言是如何定義常量的?const定義的算不算是常量? 常見的有這么幾種方式。 首先就是宏定義,使用 define 來定義。 宏的特點就是在預(yù)處理的時候被替換,比如這個地方的 SIZE
    的頭像 發(fā)表于 01-14 11:35 ?58次閱讀

    VirtualLab Fusion:區(qū)域定義

    非常靈活,具有幾個現(xiàn)成的選項以及導(dǎo)入功能。在這個用例中,我們將詳細(xì)介紹區(qū)域配置的過程。 **區(qū)域定義 ** 注意:在Light Guide組件中,可以直接在組件本身中生成和配置區(qū)域。 **簡單的區(qū)域
    發(fā)表于 01-06 08:56

    《DNK210使用指南 -CanMV版 V1.0》第三十八章 image碼識別實驗

    find_barcodes()方法,用于識別圖像中的條形碼,find_barcodes()方法如下所示:image.find_barcodes(roi)find_barcodes()方法用于識別圖像中的條形碼
    發(fā)表于 11-13 09:35

    抖動定義和測量

    引言:時鐘抖動(jitter)是現(xiàn)代通信和數(shù)字系統(tǒng)中至關(guān)重要的性能指標(biāo)之一,對數(shù)據(jù)傳輸速率和系統(tǒng)同步起著關(guān)鍵作用。本文將深入探討時鐘抖動的定義、不同類型,詳細(xì)介紹各種抖動類型的測試方法,并分析時鐘
    的頭像 發(fā)表于 10-21 16:15 ?592次閱讀
    抖動<b class='flag-5'>定義</b>和測量

    電位的定義與規(guī)定

    參考點的電壓。這個定義揭示了電位的本質(zhì):它是一個相對量,用于描述電路中某點與參考點之間的電壓差。為了便于理解和計算,我們通常將電路中的某一點(如電源的負(fù)極)作為參考點,并規(guī)定其電位為零。這個參考點也被稱為“接地
    的頭像 發(fā)表于 09-24 17:50 ?2733次閱讀

    SPI總線的定義和特點

    SPI總線(Serial Peripheral Interface),全稱為串行外圍設(shè)備接口,是由Motorola公司提出并定義的一種同步、串行、高速的通信總線。SPI總線以其獨特的優(yōu)勢在電子通信
    的頭像 發(fā)表于 09-03 14:05 ?1077次閱讀

    如何使用云服務(wù)器刷寫自定義固件?

    我們正在嘗試在沒有以前刷新固件的情況下刷新我們的自定義固件。所以里面有原裝AT固件。 當(dāng)模塊連接到 WiFi 和互聯(lián)網(wǎng)時,在 AT CIUPDATE 之后一切正常。但它正在下載/更新您的原始
    發(fā)表于 07-15 08:23

    GPT的定義和演進歷程

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

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

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

    SIM卡座的接口定義

    SIM卡座連接器的接口定義是移動通信設(shè)備中不可或缺的一部分,確保了SIM卡與設(shè)備之間的穩(wěn)定通信和數(shù)據(jù)傳輸。在本文中,連欣科技將詳細(xì)探討一下SIM卡座的接口定義,包括其結(jié)構(gòu)、引腳功能、以及接口標(biāo)準(zhǔn),為
    的頭像 發(fā)表于 06-17 17:47 ?4488次閱讀
    SIM卡座的接口<b class='flag-5'>定義</b>

    高速pcb的定義是什么

    高速pcb的定義是什么 高速PCB(Printed Circuit Board,印刷電路板)是指在高速信號傳輸、高頻應(yīng)用和高密度布局等方面具有特定設(shè)計要求的電路板。隨著電子技術(shù)的飛速發(fā)展,高速PCB
    的頭像 發(fā)表于 06-10 17:31 ?1672次閱讀

    TSMaster 自定義 LIN 調(diào)度表編程指導(dǎo)

    LIN(LocalInterconnectNetwork)協(xié)議調(diào)度表是用于LIN總線通信中的消息調(diào)度的一種機制,我們收到越來越多來自不同用戶希望能夠通過接口實現(xiàn)自定義LIN調(diào)度表的需求。所以在
    的頭像 發(fā)表于 05-11 08:21 ?713次閱讀
    TSMaster 自<b class='flag-5'>定義</b> LIN 調(diào)度表編程指導(dǎo)

    PHP用戶定義函數(shù)詳細(xì)講解

    描述 在所有編程和腳本語言中,函數(shù)是可以在程序中重復(fù)使用的語句塊。在 PHP 中,函數(shù)的概念與另一種語言(如“C”)中的概念相同。標(biāo)準(zhǔn) PHP 發(fā)行版中有 1,000 多個內(nèi)置函數(shù)。除此之外,我們
    的頭像 發(fā)表于 03-20 14:27 ?426次閱讀

    IGBT和MOSFET在對飽和區(qū)的定義差別

    它們對飽和區(qū)的定義有一些差別。 首先,讓我們從基本原理開始理解飽和區(qū)。在晶體管中,飽和區(qū)是電流最大的區(qū)域,通常被用來實現(xiàn)開關(guān)操作。晶體管在飽和區(qū)工作時,處于最低的電壓狀態(tài),導(dǎo)通電流較大。然而,飽和區(qū)的定義在IGBT和MOSFET
    的頭像 發(fā)表于 02-18 14:35 ?2317次閱讀

    物聯(lián)網(wǎng)中繼器的定義和作用

    有限的問題。在本文中,我們將詳細(xì)討論物聯(lián)網(wǎng)中繼器的定義、原理、作用以及它為物聯(lián)網(wǎng)發(fā)展帶來的影響。 首先,我們來了解一下物聯(lián)網(wǎng)中繼器的定義。物聯(lián)網(wǎng)中繼器是一種用于擴展和增強物聯(lián)網(wǎng)網(wǎng)絡(luò)覆蓋
    的頭像 發(fā)表于 02-01 10:02 ?1641次閱讀