亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

OpenCV實(shí)現(xiàn)對(duì)象跟蹤的方法

 更新時(shí)間:2021年10月18日 16:05:38   作者:woshicver  
OpenCV 是一個(gè)很好的處理圖像和視頻的工具,本文主要介紹了OpenCV 進(jìn)行對(duì)象跟蹤,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

介紹

OpenCV 是一個(gè)很好的處理圖像和視頻的工具。無論你是想讓你的照片呈現(xiàn) 90 年代的黑白效果,還是執(zhí)行復(fù)雜的數(shù)學(xué)運(yùn)算,OpenCV 都可以隨時(shí)為你服務(wù)。

如果你對(duì)計(jì)算機(jī)視覺感興趣,則必須具備 OpenCV 的知識(shí)。該庫包含 2500 多種優(yōu)化算法,可用于執(zhí)行各種任務(wù)。它被谷歌、微軟、IBM 等許多行業(yè)巨頭使用,并被廣泛用于研究小組。該庫支持多種語言,包括 java、c++ 和 python。

本文將向你展示如何使用 OpenCV 中的一些基本功能來執(zhí)行復(fù)雜的對(duì)象跟蹤任務(wù)。

對(duì)象跟蹤

對(duì)象跟蹤是在視頻中定位移動(dòng)對(duì)象的過程。你可以考慮一個(gè)足球比賽的例子。

你有正在進(jìn)行的比賽的實(shí)時(shí)饋送,你的任務(wù)是隨時(shí)跟蹤球的位置。對(duì)于普通人來說,這項(xiàng)任務(wù)似乎很簡單,但即使是最聰明的機(jī)器,它還是太復(fù)雜了。

你可能知道,計(jì)算機(jī)只能理解數(shù)字。它不了解圖像是什么,但了解與圖像相關(guān)聯(lián)的像素值。在人眼看來完全相同的兩個(gè)圖像在計(jì)算機(jī)看來可能并不相同,因?yàn)榧词瓜袼氐奈⑿∽兓矔?huì)導(dǎo)致圖片之間的差異。因?yàn)閷?duì)象跟蹤被認(rèn)為是計(jì)算機(jī)視覺中最復(fù)雜的任務(wù)之一。雖然復(fù)雜,但也不是無法實(shí)現(xiàn)的。

可以使用機(jī)器學(xué)習(xí)以及基于深度學(xué)習(xí)的方法來執(zhí)行對(duì)象跟蹤。

一方面,深度學(xué)習(xí)方法在復(fù)雜任務(wù)上提供了更好的結(jié)果,并且非常通用,需要大量的訓(xùn)練數(shù)據(jù)。而基于 ML 的方法非常簡單,但不是通用的。

在本文中,我們將使用基于 ML 的方法以及我們將在本文后面討論的各種計(jì)算機(jī)視覺技術(shù)。

該技術(shù)廣泛應(yīng)用于監(jiān)控、安全、交通監(jiān)控、機(jī)器人視覺、視頻通信等領(lǐng)域。此外,對(duì)象跟蹤有幾個(gè)用例,例如人群計(jì)數(shù)、自動(dòng)駕駛汽車、人臉檢測等。你能想出更多可以在日常生活中使用對(duì)象跟蹤的示例嗎?

由于現(xiàn)實(shí)生活中有如此多的應(yīng)用,因此該領(lǐng)域正在進(jìn)行不斷的研究,以實(shí)現(xiàn)更高的準(zhǔn)確性并使模型更加穩(wěn)健。

對(duì)于本文,我們將使用此視頻(https://drive.google.com/file/d/1N6NcFpveLQLc_DnFjfuMMvfuCMTAJRFm/view?usp=sharing)。

正如你將看到的,有一個(gè)紅色的球在迷宮中移動(dòng),我們的任務(wù)是檢測球的位置并找到它的質(zhì)心。你還可以在背景中看到巨大的噪音(人群),使任務(wù)更具挑戰(zhàn)性。

91d4fea877e0d3170384998316e5ebbd.jpg

1.首先,我們導(dǎo)入將要使用的所需庫。

import numpy as np
import cv2

2.我們將定義一個(gè)函數(shù)來調(diào)整圖像的大小,以便它們?cè)谧銐虼蟮那闆r下適合我們的屏幕。這一步是完全可選的,可以隨意跳過。

def resize(img):
        return cv2.resize(img,(512,512)) # arg1- input image, arg- output_width, output_height

3.你可能知道,視頻是由幀組成的。幀只不過是構(gòu)成整個(gè)動(dòng)態(tài)畫面的眾多靜止圖像之一。下一步將使用 OpenCV 中的 VideoCapture() 函數(shù)讀取這些幀,并使用 while 循環(huán),我們可以看到幀在移動(dòng)。

你可以使用將屏幕暫停 x 毫秒的 cv2.waitKey(x) 來調(diào)整視頻的速度。

cap=cv2.VideoCapture(vid_file_path)
ret,frame=cap.read()
 
while ret==True:
    ret,frame=cap.read()
    cv2.imshow("frame",resize(frame))
    key=cv2.waitKey(1)
    if key==ord('q'):
        break
cv2.waitKey(0)
cv2.destroyAllWindows()

4.現(xiàn)在是時(shí)候執(zhí)行一些閾值和預(yù)處理了。OpenCV 讀取 BGR 格式的圖像,因此我們將把色彩空間從 BGR 轉(zhuǎn)換為 HSV。

為什么是 HSV 而不是 BGR 或任何其他格式?

我們使用 HSV 顏色格式,因?yàn)樗鼘?duì)外部照明的微小變化更敏感。因此,它將提供更準(zhǔn)確的蒙版,從而獲得更好的結(jié)果。

轉(zhuǎn)換色彩空間后,我們要做的是過濾掉紅色通道并創(chuàng)建一個(gè)蒙版框。

hsv 格式的紅色通道出現(xiàn)在 [0,230,170] 到 [255,255,220] 范圍內(nèi)。

cap=cv2.VideoCapture(vid_file_path)
 
 
ret,frame=cap.read()
l_b=np.array([0,230,170])# lower hsv bound for red
u_b=np.array([255,255,220])# upper hsv bound to red
 
while ret==True:
    ret,frame=cap.read()
 
    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,l_b,u_b)
 
    cv2.imshow("frame",resize(frame))
 
    cv2.imshow("mask",mask)
 
 
    key=cv2.waitKey(1)
    if key==ord('q'):
        break
cv2.waitKey(0)
cv2.destroyAllWindows()

b6decc3fd55c1004b61e133dd4bf1c9e.jpg

(此圖已調(diào)整大?。?/p>

5.到目前為止,我們已經(jīng)創(chuàng)建了幀的蒙版圖像,并且我們已經(jīng)過濾掉了大部分噪聲。接下來是獲得球的邊界。為此,我們將使用輪廓檢測的概念。

輪廓只不過是圍繞我們球的邊界。值得慶幸的是,我們不必自己找到這些邊界,因?yàn)?OpenCV 允許我們可以將其用于我們的目的的函數(shù) findContours()。它需要一個(gè)蒙版圖像并返回一個(gè)輪廓數(shù)組。

有關(guān)輪廓的更多信息,請(qǐng)?jiān)L問:https://docs.opencv.org/4.5.2/d4/d73/tutorial_py_contours_begin.html

理想情況下,在我們的例子中,輪廓的值應(yīng)該是 1,因?yàn)槲覀冎挥幸粋€(gè)球,但由于有些人戴著紅帽子,我們會(huì)得到不止一個(gè)。你能想出一些辦法來進(jìn)一步降低這種噪音嗎?

為了解決這個(gè)問題,我們將使用 OpenCV 中的另一個(gè)函數(shù) cv2.contourArea()。我們知道在蒙版圖像中,球的面積最大,它的輪廓也是如此。因此,我們將得到面積最大的輪廓。

我們有球的輪廓,我們可以使用 cv2.drawContours() 函數(shù)直接繪制這些輪廓。但是對(duì)于檢測任務(wù),我們一般做的就是用一個(gè)緊密綁定的矩形來表示對(duì)象已經(jīng)被檢測到了。

為此,我們將使用 cv2.boundingRect() 函數(shù)。此函數(shù)將返回矩形的坐標(biāo),然后 cv2.rectangle() 函數(shù)將為我們繪制矩形。

cap=cv2.VideoCapture(vid_file_path)
 
 
ret,frame=cap.read()
l_b=np.array([0,230,170])# lower hsv bound for red
u_b=np.array([255,255,220])# upper hsv bound to red
 
while ret==True:
    ret,frame=cap.read()
 
    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,l_b,u_b)
 
    contours,_= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
 
    max_contour = contours[0]
         for contour in contours:
                if cv2.contourArea(contour)>cv2.contourArea(max_contour):
 
                      max_contour=contour
 
         contour=max_contour
         approx=cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True),True)
         x,y,w,h=cv2.boundingRect(approx)
         cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),4)
 
    cv2.imshow("frame",resize(frame))
 
    cv2.imshow("mask",mask)

d322b9afd5f1618649233b5160acc913.jpg

(此圖已調(diào)整大小)

6.此外,我們可以做的是同時(shí)檢測球的質(zhì)心。為此,我們將使用 cv2.moments。cv2.moments 計(jì)算輪廓內(nèi)像素強(qiáng)度的加權(quán)平均總和,因此允許從斑點(diǎn)中獲取一些更有用的信息,如其半徑、質(zhì)心等。

確保在使用該函數(shù)之前將圖像轉(zhuǎn)換為二進(jìn)制格式。你可以在這里了解更多關(guān)于時(shí)刻的信息:https://docs.opencv.org/3.4/d0/d49/tutorial_moments.html。

cap=cv2.VideoCapture(vid_file_path)
 
 
ret,frame=cap.read()
l_b=np.array([0,230,170])# lower hsv bound for red
u_b=np.array([255,255,220])# upper hsv bound to red
 
while ret==True:
    ret,frame=cap.read()
 
    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,l_b,u_b)
 
    contours,_= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
 
    max_contour = contours[0]
         for contour in contours:
 
 
                if cv2.contourArea(contour)>cv2.contourArea(max_contour):
 
                  max_contour = contour
 
         approx=cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True),True)
         x,y,w,h=cv2.boundingRect(approx)
         cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),4)
 
         M=cv2.moments(contour)

364ad9a8e21446d83e0c2124040577f0.jpg

到此這篇關(guān)于開始使用 OpenCV 進(jìn)行對(duì)象跟蹤的文章就介紹到這了,更多相關(guān)OpenCV 對(duì)象跟蹤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Python實(shí)現(xiàn)一個(gè)文件夾整理工具

    基于Python實(shí)現(xiàn)一個(gè)文件夾整理工具

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)一個(gè)簡單的文件夾整理工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • python圖形用戶界面tkinter之按鈕Button的使用說明

    python圖形用戶界面tkinter之按鈕Button的使用說明

    這篇文章主要介紹了python圖形用戶界面tkinter之按鈕Button的使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 教你使用Python根據(jù)模板批量生成docx文檔

    教你使用Python根據(jù)模板批量生成docx文檔

    這篇文章主要介紹了教你使用Python根據(jù)模板批量生成docx文檔,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • python中的單引號(hào)雙引號(hào)區(qū)別知識(shí)點(diǎn)總結(jié)

    python中的單引號(hào)雙引號(hào)區(qū)別知識(shí)點(diǎn)總結(jié)

    在本篇文章中小編給大家整理了關(guān)于python中的單引號(hào)雙引號(hào)有什么區(qū)別的相關(guān)知識(shí)點(diǎn)以及實(shí)例代碼,需要的朋友們參考下。
    2019-06-06
  • python名片管理系統(tǒng)開發(fā)

    python名片管理系統(tǒng)開發(fā)

    這篇文章主要為大家詳細(xì)介紹了python名片管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Python如何在單元測試中給對(duì)象打補(bǔ)丁

    Python如何在單元測試中給對(duì)象打補(bǔ)丁

    這篇文章主要介紹了Python如何在單元測試中給對(duì)象打補(bǔ)丁,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • 使用matlab 判斷兩個(gè)矩陣是否相等的實(shí)例

    使用matlab 判斷兩個(gè)矩陣是否相等的實(shí)例

    這篇文章主要介紹了使用matlab 判斷兩個(gè)矩陣是否相等的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Opencv對(duì)象追蹤的示例代碼

    Opencv對(duì)象追蹤的示例代碼

    這篇文章主要介紹了Opencv對(duì)象追蹤的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python下調(diào)用Linux的Shell命令的方法

    Python下調(diào)用Linux的Shell命令的方法

    有時(shí)候難免需要直接調(diào)用Shell命令來完成一些比較簡單的操作,這篇文章主要介紹了Python下調(diào)用Linux的Shell命令的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Python執(zhí)行時(shí)間的計(jì)算方法小結(jié)

    Python執(zhí)行時(shí)間的計(jì)算方法小結(jié)

    這篇文章主要介紹了Python執(zhí)行時(shí)間的計(jì)算方法小結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評(píng)論