<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OpenCV系列(八)移動物體檢測

          共 2444字,需瀏覽 5分鐘

           ·

          2021-03-06 18:34

          移動偵測,一般也叫運動檢測,常用于無人值守監(jiān)控錄像和自動報警。通過攝像頭按照不同幀率采集得到的圖像會被CPU按照一定算法進行計算和比較,當畫面有變化時,如有人走過,鏡頭被移動,計算比較結果得出的數(shù)字會超過閾值并指示系統(tǒng)能自動作出相應的處理。



          OpenCV 實現(xiàn)

          SPRING

          那么在Opencv中,是怎么樣進行移動物體檢測的呢?其實Opencv中幫我們封裝好了背景減法的算法,我們只需要取得視頻當前幀及的前一幀,然后使用這個算法得到這兩幀的差異,再對其進行處理即可,具體代碼如下:

          import cv2cam= cv2.VideoCapture('opencv_image/vtest.avi')
          # 先讀取視頻的前2幀_,img1=cam.read()_,img2=cam.read()
          while cam.isOpened(): # 獲得兩幀之間的差異 diff=cv2.absdiff(img1,img2) cv2.imshow('diff',diff) # 圖像處理:灰度,高斯模糊,二值化 gray=cv2.cvtColor(diff,cv2.COLOR_BGR2GRAY) blur=cv2.GaussianBlur(gray,(5,5),0) _,th=cv2.threshold(blur,20,255,cv2.THRESH_BINARY) # 圖像膨脹操作 dilated=cv2.dilate(th,None,iterations=3) cv2.imshow('dilated',dilated) # 獲取輪廓 contours,_=cv2.findContours(dilated,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 判斷矩形是否滿足條件 for contour in contours: (x,y,w,h)=cv2.boundingRect(contour) if cv2.contourArea(contour) <700: continue else: cv2.rectangle(img1,(x,y),(x+w,y+h),(0,255,0),1) cv2.imshow('image',img1) # 讀下一幀 img1=img2 _,img2=cam.read() flag=cv2.waitKey(100) if flag==ord('q'): break# 別忘記釋放攝像頭cam.release()cv2.destroyAllWindows()


          程序運行的結果如下,在視頻中運動的人以及飄動的隔離帶都被方框標注了出來:


          函數(shù)解釋

          SPRING

          這個檢測綜合了比較多的OpenCV函數(shù),一一為大家解釋這些函數(shù)的參數(shù)以及作用:


          dilated=cv2.dilate(src,kernel,iteration)

          作用:形態(tài)學操作-膨脹

          src

          輸入的圖片

          kernel

          表示方框的大小

          interation

          迭代的次數(shù)

          膨脹操作的原理,存在一個kernel,在圖像上進行從左到右,從上到下的平移,如果方框中存在白色,那么這個方框內(nèi)所有的顏色都是白色。也就是說,它可以將二值化圖片中細小的白色‘變胖’。


          contours,hierarchy=cv2.findContours(img,mode,method)

          作用:查找檢測物體的輪廓

          image

          帶有輪廓信息的圖片

          model

          提取出輪廓后,輸出輪廓信息的組織形式,通常由以下幾種選項:

          • cv2.RETR_EXTERNAL:輸出輪廓中只有外側輪廓信息;

          • cv2.RETR_LIST:以列表形式輸出輪廓信息,各輪廓之間無等級關系;

          • cv2.RETR_CCOMP:輸出兩層輪廓信息,即內(nèi)外兩個邊界(下面將會說到contours的數(shù)據(jù)結構);

          • cv2.RETR_TREE:以樹形結構輸出輪廓信息

          method

          輪廓的近似辦法,有以下選項:

          • cv2.CHAIN_APPROX_NONE:存儲輪廓所有點的信息,相鄰兩個輪廓點在圖像上也是相鄰的;

          • cv2.CHAIN_APPROX_SIMPLE:壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標;

          • cv2.CHAIN_APPROX_TC89_L1:使用teh-Chinl chain近似算法保存輪廓信息。

          contours

          list結構,列表中每個元素代表一個邊沿信息。每個元素是(x,1,2)的三維向量,x表示該條邊沿里共有多少個像素點,第三維的那個“2”表示每個點的橫、縱坐標

          hierarchy

          返回類型是(x,4)的二維ndarray。x和contours里的x是一樣的意思。如果輸入選擇cv2.RETR_TREE,則以樹形結構組織輸出,hierarchy的四列分別對應下一個輪廓編號、上一個輪廓編號、父輪廓編號、子輪廓編號,該值為負數(shù)表示沒有對應項


          注:如果輸入選擇cv2.CHAIN_APPROX_SIMPLE,則contours中一個list元素所包含的x點之間應該用直線連接起來,這個可以用cv2.drawContours()函數(shù)觀察一下效果。

          函數(shù)解析:cv2.boundingRect(cnt)

          作用一般于輪廓檢測以前使用,可以使用一個最小的矩形,把找到的形狀包起來。cnt 即輪廓檢測中的每一個contour。


          瀏覽 253
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  69免费视频在线 | 黄色性交在现 | 黑人大战亚洲女人网站 | 天天插天天爽 | 奇米狠狠啦av |