<span id="l42vo"></span>
<progress id="l42vo"><big id="l42vo"></big></progress>
  • <th id="l42vo"></th>
    <rp id="l42vo"></rp>
    <em id="l42vo"><strike id="l42vo"></strike></em>
    <li id="l42vo"></li>
    <label id="l42vo"><object id="l42vo"><input id="l42vo"></input></object></label>
  • 教育行業A股IPO第一股(股票代碼 003032)

    全國咨詢/投訴熱線:400-618-4000

    meanshift算法原理:meanshift跟蹤算法實戰

    更新時間:2021年07月27日15時24分 來源:傳智教育 瀏覽次數:

    meanshift算法原理

    meanshift算法的原理很簡單。假設你有一堆點集,還有一個小的窗口,這個窗口可能是圓形的,現在你可能要移動這個窗口到點集密度最大的區域當中。

    如下圖:

    meanshift算法的原理

    最開始的窗口是藍色圓環的區域,命名為C1。藍色圓環的圓心用一個藍色的矩形標注,命名為C1_o。

    而窗口中所有點的點集構成的質心在藍色圓形點C1_r處,顯然圓環的形心和質心并不重合。所以,移動藍色的窗口,使得形心與之前得到的質心重合。在新移動后的圓環的區域當中再次尋找圓環當中所包圍點集的質心,然后再次移動,通常情況下,形心和質心是不重合的。不斷執行上面的移動過程,直到形心和質心大致重合結束。 這樣,最后圓形的窗口會落到像素分布最大的地方,也就是圖中的綠色圈,命名為C2。

    meanshift算法除了應用在視頻追蹤當中,在聚類,平滑等等各種涉及到數據以及非監督學習的場合當中均有重要應用,是一個應用廣泛的算法。

    圖像是一個矩陣信息,如何在一個視頻當中使用meanshift算法來追蹤一個運動的物體呢? 大致流程如下:

    1.首先在圖像上選定一個目標區域

    2.計算選定區域的直方圖分布,一般是HSV色彩空間的直方圖。

    3.對下一幀圖像b同樣計算直方圖分布。

    4.計算圖像b當中與選定區域直方圖分布最為相似的區域,使用meanshift算法將選定區域沿著最為相似的部分進行移動,直到找到最相似的區域,便完成了在圖像b中的目標追蹤。

    5.重復3到4的過程,就完成整個視頻目標追蹤。

    通常情況下我們使用直方圖反向投影得到的圖像和第一幀目標對象的起始位置,當目標對象的移動會反映到直方圖反向投影圖中,meanshift 算法就把我們的窗口移動到反向投影圖像中灰度密度最大的區域了。如下圖所示:

    直方圖反向投影的流程是:

    假設我們有一張100x100的輸入圖像,有一張10x10的模板圖像,查找的過程是這樣的:

    1.從輸入圖像的左上角(0,0)開始,切割一塊(0,0)至(10,10)的臨時圖像;

    2.生成臨時圖像的直方圖;

    3.用臨時圖像的直方圖和模板圖像的直方圖對比,對比結果記為c;

    4.直方圖對比結果c,就是結果圖像(0,0)處的像素值;

    5.切割輸入圖像從(0,1)至(10,11)的臨時圖像,對比直方圖,并記錄到結果圖像;

    6.重復1~5步直到輸入圖像的右下角,就形成了直方圖的反向投影。

    meanshift視頻追蹤實現

    在OpenCV中實現Meanshift的API是:

    cv.meanShift(probImage, window, criteria)

    參數:

    ·probImage: ROI區域,即目標的直方圖的反向投影

    ·window: 初始搜索窗口,就是定義ROI的rect

    ·criteria: 確定窗口搜索停止的準則,主要有迭代次數達到設置的最大值,窗口中心的漂移值大于某個設定的限值等。

    實現Meanshift的主要流程是:

    1.讀取視頻文件:cv.videoCapture()

    2.感興趣區域設置:獲取第一幀圖像,并設置目標區域,即感興趣區域

    3.計算直方圖:計算感興趣區域的HSV直方圖,并進行歸一化

    4.目標追蹤:設置窗口搜索停止條件,直方圖反向投影,進行目標追蹤,并在目標位置繪制矩形框。

    示例:

    import numpy as np
    import cv2 as cv
    # 1.獲取圖像
    cap = cv.VideoCapture('DOG.wmv')
    
    # 2.獲取第一幀圖像,并指定目標位置
    ret,frame = cap.read()
    # 2.1 目標位置(行,高,列,寬)
    r,h,c,w = 197,141,0,208  
    track_window = (c,r,w,h)
    # 2.2 指定目標的感興趣區域
    roi = frame[r:r+h, c:c+w]
    
    # 3. 計算直方圖
    # 3.1 轉換色彩空間(HSV)
    hsv_roi =  cv.cvtColor(roi, cv.COLOR_BGR2HSV)
    # 3.2 去除低亮度的值
    # mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
    # 3.3 計算直方圖
    roi_hist = cv.calcHist([hsv_roi],[0],None,[180],[0,180])
    # 3.4 歸一化
    cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)
    
    # 4. 目標追蹤
    # 4.1 設置窗口搜索終止條件:最大迭代次數,窗口中心漂移最小值
    term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )
    
    while(True):
        # 4.2 獲取每一幀圖像
        ret ,frame = cap.read()
        if ret == True:
            # 4.3 計算直方圖的反向投影
            hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
            dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)
    
            # 4.4 進行meanshift追蹤
            ret, track_window = cv.meanShift(dst, track_window, term_crit)
    
            # 4.5 將追蹤的位置繪制在視頻上,并進行顯示
            x,y,w,h = track_window
            img2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2)
            cv.imshow('frame',img2)
    
            if cv.waitKey(60) & 0xFF == ord('q'):
                break        
        else:
            break
    # 5. 資源釋放        
    cap.release()
    cv.destroyAllWindows()
    
    

    下面是三幀圖像的跟蹤結果:

    meanshift視頻追蹤效果

    Camshift算法

    大家認真看下上面的結果,有一個問題,就是檢測的窗口的大小是固定的,而狗狗由近及遠是一個逐漸變小的過程,固定的窗口是不合適的。所以我們需要根據目標的大小和角度來對窗口的大小和角度進行修正。CamShift可以幫我們解決這個問題。

    CamShift算法全稱是“Continuously Adaptive Mean-Shift”(連續自適應MeanShift算法),是對MeanShift算法的改進算法,可隨著跟蹤目標的大小變化實時調整搜索窗口的大小,具有較好的跟蹤效果。

    Camshift算法首先應用meanshift,一旦meanshift收斂,它就會更新窗口的大小,還計算最佳擬合橢圓的方向,從而根據目標的位置和大小更新搜索窗口。如下圖所示:

    Camshift算法

    Camshift在OpenCV中實現時,只需將上述的meanshift函數改為Camshift函數即可:

    將Camshift中的:

     # 4.4 進行meanshift追蹤
            ret, track_window = cv.meanShift(dst, track_window, term_crit)
            # 4.5 將追蹤的位置繪制在視頻上,并進行顯示
            x,y,w,h = track_window
            img2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2)
    
    

    改為:

    #進行camshift追蹤
        ret, track_window = cv.CamShift(dst, track_window, term_crit)
    
            # 繪制追蹤結果
            pts = cv.boxPoints(ret)
            pts = np.int0(pts)
            img2 = cv.polylines(frame,[pts],True, 255,2)
    
    

    算法總結

    meanshift

    原理:一個迭代的步驟,即先算出當前點的偏移均值,移動該點到其偏移均值,然后以此為新的起始點,繼續移動,直到滿足一定的條件結束。

    API:cv.meanshift()

    優缺點:簡單,迭代次數少,但無法解決目標的遮擋問題并且不能適應運動目標的的形狀和大小變化

    camshift

    原理:對meanshift算法的改進,首先應用meanshift,一旦meanshift收斂,它就會更新窗口的大小,還計算最佳擬合橢圓的方向,從而根據目標的位置和大小更新搜索窗口。

    API:cv.camshift()

    優缺點:可適應運動目標的大小形狀的改變,具有較好的跟蹤效果,但當背景色和目標顏色接近時,容易使目標的區域變大,最終有可能導致目標跟蹤丟失

    《圖像處理OpenCV入門教程》課程導讀


    加QQ:2217622915,獲取《圖像處理OpenCV入門教程》全套視頻教程+筆記+源碼。



    猜你喜歡:

    OpenCV圖片相加和混合的方法

    什么是OpenCV?OpenCV安裝教程

    Harris角點檢測原理

    語言模型-BERT:bert算法介紹

    傳智教育人工智能開發課程

    中文字幕手机在线看片不卡,国产日韩欧美不卡在线二区,国产精品国产自线拍,么公的粗大征服了我 小说 网站地图 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>