1. 程式人生 > 程式設計 >基於Python檢測動態物體顏色過程解析

基於Python檢測動態物體顏色過程解析

本篇文章將通過圖片對比的方法檢查視訊中的動態物體,並將其中會動的物體定位用cv2矩形框圈出來。本次專案可用於樹莓派或者微控制器追蹤做一些思路參考。尋找動態物體也可以用來監控是否有人進入房間等等場所的監控。不僅如此,通過對物體的畫素值判斷分類,達到判斷動態物體總體顏色的效果。

引言

物體檢測,是一種基於目的幾何學和統計資料特點的影像拆分,它將目的的拆分和辨識,其準確度和實時性是整個該系統的一項最重要戰鬥能力。特別是在是在簡單橋段中的,必須對多個目的展開實時處理時,目的系統會萃取和辨識就變得尤其最重要。

隨著計算機的持續發展和計算機系統感官基本原理的應用,建模資料處理新技術對目的展開動態追蹤研究工作更加受歡迎,對目的展開靜態動態追蹤整合在資訊化公交系統、人工智慧監視該系統、軍事戰略目的檢驗及藥學導航系統手術後中的手術器械整合等各個方面具備普遍的應用於商業價值。

開始前的準備

而這裡顯然我們沒必要做到如此高深的地步,而是藉助python和OpenCV通過圖片相減的方法找到動態物體,然後根據畫素值的大小判斷其中的均值顏色。

import cv2
import numpy as np
import collections
import time

下面是讀取攝像頭:

camera = cv2.VideoCapture(0)

做一些開始前的準備,包括迴圈次數,攝像頭內容讀入,儲存上一幀的圖片作為對比作差找到動態物體,然後定義框架的長和寬。

firstframe = None
a=0
ret0,frame0 = camera.read()
cv2.imwrite("1.jpg",frame0)
x,y,w,h = 10,10,100,100

下面是定義顏色的部分程式碼,比如定義的黑色,可以參照hsv表進行拓展,如圖所示

然後可以知道黑色的最低值為0,0,最大值為180,255,46然後建立陣列儲存顏色資料,通過字典達到對映效果。

# 處理圖片
def get_color(frame):
  print('go in get_color')
  hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
  maxsum = -100
  color = None
  color_dict = getColorList()
  for d in color_dict:
    mask = cv2.inRange(frame,color_dict[d][0],color_dict[d][1])
    cv2.imwrite(d + '.jpg',mask)
    binary = cv2.threshold(mask,127,255,cv2.THRESH_BINARY)[1]
    binary = cv2.dilate(binary,None,iterations=2)
    img,cnts,hiera = cv2.findContours(binary.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    sum = 0
    for c in cnts:
      sum += cv2.contourArea(c)
    if sum > maxsum:
      maxsum = sum
      color = d 
return color

影象處理

緊接著是影象處理,其中包括轉為灰度圖,讀取顏色字典,然後腐化膨脹操作。

# 處理圖片
def get_color(frame):
  print('go in get_color')
  hsv = cv2.cvtColor(frame,cv2.CHAIN_APPROX_SIMPLE)
    sum = 0
    for c in cnts:
      sum += cv2.contourArea(c)
    if sum > maxsum:
      maxsum = sum
      color = d 
return color

圖片相減的辦法

然後是圖片相減找到動態物體的程式碼,每迴圈5次儲存一次圖片,時間是很短的不用擔心。然後通過absdiff函式對圖片畫素值作差找到動態物體,接著講畫素值相減非零的部分用矩形框圈出來。

while True:
  ret,frame = camera.read()
  if not ret:
    break
  gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
  gray = cv2.GaussianBlur(gray,(21,21),0)
  a=a+1
  if a%5==0:
    cv2.imwrite("1.jpg",frame)
  firstframe=cv2.imread("1.jpg")
  firstframe= cv2.cvtColor(firstframe,cv2.COLOR_BGR2GRAY)
  firstframe= cv2.GaussianBlur(firstframe,0)
  frameDelta = cv2.absdiff(firstframe,gray)
  thresh = cv2.threshold(frameDelta,25,cv2.THRESH_BINARY)[1]
  thresh = cv2.dilate(thresh,iterations=2)
  # cnts= cv2.findContours(thresh.copy(),cv2.CHAIN_APPROX_SIMPLE)

  x,h = cv2.boundingRect(thresh)
  frame = cv2.rectangle(frame,(x,y),(x + w,y + h),(0,255),2)
  cv2.imshow("frame",frame)

因為儲存圖片是每隔5次進行一次,在某個瞬間可能儲存的圖片不存在等原因,所以需要通過try的方法避免錯誤,最終的演示效果文末有。

 try:
    ret0,frame0 = camera.read()
    cropped = frame0[y:y+h,x:x+w ] # 裁剪座標為[y0:y1,x0:x1]
    cv2.imwrite("3.jpg",cropped)

    frame1 = cv2.imread(filename)
    print(get_color(frame1))
    # plt.title(label[model.predict_classes(image)],fontproperties=myfont)
    imgzi = cv2.putText(frame,get_color(frame1),(30,30),cv2.FONT_HERSHEY_COMPLEX,1.2,(255,2)
    cv2.imwrite("2.jpg",imgzi)
    cv2.imshow("frame",cv2.imread("2.jpg"))
  except:
    pass

  key = cv2.waitKey(1) & 0xFF

  if key == ord("q"):
    break

camera.release()

其最終演示效果如圖所示:

至此,動態物體檢測程式碼基本實現。其中的拓展功能可以按照自己的需求進行修改、

目標檢測的發展

下面就將目標檢測發展做個簡單介紹,感興趣的朋友可以多多學習。

目標檢驗對於生物來說非常艱難,通過對照片中的有所不同色調元件的感官很更容易整合並歸類出有其中目標物體,但對於計算機系統來說,面臨的是畫素解析度行列式,難以從影像中的必要獲得貓和狗這樣的基本概念並整合其方位,再行再加通常多個物體和凌亂的複雜背景夾雜在一同,目標檢驗更為艱難。但這難不倒生物學家們,在現代感官各個領域,目的檢驗就是一個十分受歡迎的研究工作朝向,一些特定目的的檢驗,比如圖片檢驗和天橋檢驗早已有十分成熟期的新技術了。一般來說的目標檢驗也有過很多的試圖,但是視覺效果常常不錯。現代的目的檢驗一般用於轉動視窗的構建,主要還包括三個方法:

藉助有所不同大小的轉動視窗框住圖中的某一部分作為候選區域內;

萃取候選區域內涉及的感官特點。比如圖片檢驗常見的Harr特點;天橋檢驗和一般來說目的檢驗常見的HOG特點等;

藉助決策樹展開辨識,比如常見的SVM建模。

目的檢驗的第一步是要做到區域提名(region Proposal),也就是找到有可能的有興趣區域內(region In Risk,ROI)。區域提名類似透鏡字元識別(OCR)各個領域的重複,OCR重複常見過重複方式,非常簡單說道就是儘可能磨碎到小的相連(比如小的筆劃之類),然後再行根據鄰接塊的一些親緣特點展開拆分。但目的檢驗的單純比起OCR各個領域千差萬別,而且三維點狀,大小不等,所以一定高度上可以說道區域提名是比OCR重複更難的一個難題。

區域提名有可能的方式有:

一、轉動視窗。轉動視窗事物上就是窮舉法,藉助有所不同的時間尺度和長方形比把所有有可能的大大小小的塊都窮舉出來,然後送來去辨識,辨識出來機率大的就留下。很顯著,這樣的方式複雜性太低,造成了很多的校驗候選區域內,在現實生活中不不切實際。

二、比賽規則塊。在窮舉法的為基礎展開了一些剪枝,只搭配相同的尺寸和長方形比。這在一些特定的應用於橋段是很有效地的,比如照片搜題App小猿搜題中的的簡化字檢驗,因為簡化字方方正正,長方形比多數較為完全一致,因此用比賽規則塊做到區域內獎提名是一種較為適合的自由選擇。但是對於一般來說的目的檢驗來說,比賽規則塊仍然必須採訪很多的方位,複雜性低。

三、特異性搜尋。從神經網路的視角來說,後面的方式解任是不俗了,但是精確度不錯,所以難題的架構在於如何有效除去校驗候選區域內。只不過校驗候選區域內多數是再次發生了重合,特異性搜尋藉助這一點,自底向上拆分鄰接的重合區域內,從而增加校驗。

區域內獎提名非常只有以上所說的三種方式,實質上這塊是靈活的,因此變型也很多,感興趣的閱讀不妨參照一下歷史文獻,最終介紹到此結束。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。