基于Python檢測(cè)動(dòng)態(tài)物體顏色過(guò)程解析
本篇文章將通過(guò)圖片對(duì)比的方法檢查視頻中的動(dòng)態(tài)物體,并將其中會(huì)動(dòng)的物體定位用cv2矩形框圈出來(lái)。本次項(xiàng)目可用于樹(shù)莓派或者單片機(jī)追蹤做一些思路參考。尋找動(dòng)態(tài)物體也可以用來(lái)監(jiān)控是否有人進(jìn)入房間等等場(chǎng)所的監(jiān)控。不僅如此,通過(guò)對(duì)物體的像素值判斷分類(lèi),達(dá)到判斷動(dòng)態(tài)物體總體顏色的效果。
引言
物體檢測(cè),是一種基于目的幾何學(xué)和統(tǒng)計(jì)資料特點(diǎn)的影像拆分,它將目的的拆分和辨識(shí),其準(zhǔn)確度和實(shí)時(shí)性是整個(gè)該系統(tǒng)的一項(xiàng)最重要戰(zhàn)斗能力。特別是在是在簡(jiǎn)單橋段中的,必須對(duì)多個(gè)目的展開(kāi)實(shí)時(shí)處理時(shí),目的系統(tǒng)會(huì)萃取和辨識(shí)就變得尤其最重要。
隨著計(jì)算機(jī)的持續(xù)發(fā)展和計(jì)算機(jī)系統(tǒng)感官基本原理的應(yīng)用,建模數(shù)據(jù)處理新技術(shù)對(duì)目的展開(kāi)動(dòng)態(tài)追蹤研究工作更加受歡迎,對(duì)目的展開(kāi)靜態(tài)動(dòng)態(tài)追蹤整合在信息化公交系統(tǒng)、人工智能監(jiān)視該系統(tǒng)、軍事戰(zhàn)略目的檢驗(yàn)及藥學(xué)導(dǎo)航系統(tǒng)手術(shù)后中的手術(shù)器械整合等各個(gè)方面具備普遍的應(yīng)用于商業(yè)價(jià)值。
開(kāi)始前的準(zhǔn)備
而這里顯然我們沒(méi)必要做到如此高深的地步,而是借助python和OpenCV通過(guò)圖片相減的方法找到動(dòng)態(tài)物體,然后根據(jù)像素值的大小判斷其中的均值顏色。
import cv2 import numpy as np import collections import time
下面是讀取攝像頭:
camera = cv2.VideoCapture(0)
做一些開(kāi)始前的準(zhǔn)備,包括循環(huán)次數(shù),攝像頭內(nèi)容讀入,保存上一幀的圖片作為對(duì)比作差找到動(dòng)態(tài)物體,然后定義框架的長(zhǎng)和寬。
firstframe = None
a=0
ret0,frame0 = camera.read()
cv2.imwrite("1.jpg",frame0)
x, y, w, h = 10,10,100,100
下面是定義顏色的部分代碼,比如定義的黑色,可以參照hsv表進(jìn)行拓展,如圖所示

然后可以知道黑色的最低值為0,0,0,最大值為180,255,46然后建立數(shù)組存儲(chǔ)顏色數(shù)據(jù),通過(guò)字典達(dá)到映射效果。
# 處理圖片
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
圖像處理
緊接著是圖像處理,其中包括轉(zhuǎn)為灰度圖,讀取顏色字典,然后腐化膨脹操作。
# 處理圖片
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
圖片相減的辦法
然后是圖片相減找到動(dòng)態(tài)物體的代碼,每循環(huán)5次保存一次圖片,時(shí)間是很短的不用擔(dān)心。然后通過(guò)absdiff函數(shù)對(duì)圖片像素值作差找到動(dòng)態(tài)物體,接著講像素值相減非零的部分用矩形框圈出來(lái)。
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, (21, 21), 0)
frameDelta = cv2.absdiff(firstframe, gray)
thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.dilate(thresh, None, iterations=2)
# cnts= cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
x, y, w, h = cv2.boundingRect(thresh)
frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow("frame", frame)
因?yàn)楸4鎴D片是每隔5次進(jìn)行一次,在某個(gè)瞬間可能保存的圖片不存在等原因,所以需要通過(guò)try的方法避免錯(cuò)誤,最終的演示效果文末有。
try:
ret0, frame0 = camera.read()
cropped = frame0[y:y+h,x:x+w ] # 裁剪坐標(biāo)為[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, 255, 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()
其最終演示效果如圖所示:

至此,動(dòng)態(tài)物體檢測(cè)代碼基本實(shí)現(xiàn)。其中的拓展功能可以按照自己的需求進(jìn)行修改、
目標(biāo)檢測(cè)的發(fā)展
下面就將目標(biāo)檢測(cè)發(fā)展做個(gè)簡(jiǎn)單介紹,感興趣的朋友可以多多學(xué)習(xí)。
目標(biāo)檢驗(yàn)對(duì)于生物來(lái)說(shuō)非常艱難,通過(guò)對(duì)照片中的有所不同色調(diào)組件的感官很更容易整合并歸類(lèi)出有其中目標(biāo)物體,但對(duì)于計(jì)算機(jī)系統(tǒng)來(lái)說(shuō),面臨的是像素分辨率行列式,難以從影像中的必要獲得貓和狗這樣的基本概念并整合其方位,再行再加通常多個(gè)物體和凌亂的復(fù)雜背景夾雜在一同,目標(biāo)檢驗(yàn)更為艱難。但這難不倒生物學(xué)家們,在現(xiàn)代感官各個(gè)領(lǐng)域,目的檢驗(yàn)就是一個(gè)十分受歡迎的研究工作朝向,一些特定目的的檢驗(yàn),比如圖片檢驗(yàn)和天橋檢驗(yàn)早已有十分成熟期的新技術(shù)了。一般來(lái)說(shuō)的目標(biāo)檢驗(yàn)也有過(guò)很多的試圖,但是視覺(jué)效果常常不錯(cuò)?,F(xiàn)代的目的檢驗(yàn)一般用于轉(zhuǎn)動(dòng)視窗的構(gòu)建,主要還包括三個(gè)方法:
借助有所不同大小的轉(zhuǎn)動(dòng)視窗框住圖中的某一部分作為候選區(qū)域內(nèi);
萃取候選區(qū)域內(nèi)涉及的感官特點(diǎn)。比如圖片檢驗(yàn)常見(jiàn)的Harr特點(diǎn);天橋檢驗(yàn)和一般來(lái)說(shuō)目的檢驗(yàn)常見(jiàn)的HOG特點(diǎn)等;
借助決策樹(shù)展開(kāi)辨識(shí),比如常見(jiàn)的SVM建模。
目的檢驗(yàn)的第一步是要做到區(qū)域提名(region Proposal),也就是找到有可能的有興趣區(qū)域內(nèi)(region In Risk, ROI)。區(qū)域提名類(lèi)似透鏡字符識(shí)別(OCR)各個(gè)領(lǐng)域的重復(fù),OCR重復(fù)常見(jiàn)過(guò)重復(fù)方式,非常簡(jiǎn)單說(shuō)道就是盡可能磨碎到小的相連(比如小的筆劃之類(lèi)),然后再行根據(jù)鄰接塊的一些親緣特點(diǎn)展開(kāi)拆分。但目的檢驗(yàn)的單純比起OCR各個(gè)領(lǐng)域千差萬(wàn)別,而且三維點(diǎn)狀,大小不等,所以一定高度上可以說(shuō)道區(qū)域提名是比OCR重復(fù)更難的一個(gè)難題。
區(qū)域提名有可能的方式有:
一、轉(zhuǎn)動(dòng)視窗。轉(zhuǎn)動(dòng)視窗事物上就是窮舉法,借助有所不同的時(shí)間尺度和長(zhǎng)方形比把所有有可能的大大小小的塊都窮舉出來(lái),然后送來(lái)去辨識(shí),辨識(shí)出來(lái)機(jī)率大的就留下。很顯著,這樣的方式復(fù)雜性太低,造成了很多的校驗(yàn)候選區(qū)域內(nèi),在現(xiàn)實(shí)生活中不不切實(shí)際。
二、比賽規(guī)則塊。在窮舉法的為基礎(chǔ)展開(kāi)了一些剪枝,只搭配相同的尺寸和長(zhǎng)方形比。這在一些特定的應(yīng)用于橋段是很有效地的,比如照片搜題App小猿搜題中的的簡(jiǎn)化字檢驗(yàn),因?yàn)楹?jiǎn)化字方方正正,長(zhǎng)方形比多數(shù)較為完全一致,因此用比賽規(guī)則塊做到區(qū)域內(nèi)獎(jiǎng)提名是一種較為適合的自由選擇。但是對(duì)于一般來(lái)說(shuō)的目的檢驗(yàn)來(lái)說(shuō),比賽規(guī)則塊仍然必須采訪(fǎng)很多的方位,復(fù)雜性低。
三、特異性搜尋。從神經(jīng)網(wǎng)絡(luò)的視角來(lái)說(shuō),后面的方式解任是不俗了,但是精確度不錯(cuò),所以難題的架構(gòu)在于如何有效除去校驗(yàn)候選區(qū)域內(nèi)。只不過(guò)校驗(yàn)候選區(qū)域內(nèi)多數(shù)是再次發(fā)生了重合,特異性搜尋借助這一點(diǎn),自底向上拆分鄰接的重合區(qū)域內(nèi),從而增加校驗(yàn)。
區(qū)域內(nèi)獎(jiǎng)提名非常只有以上所說(shuō)的三種方式,實(shí)質(zhì)上這塊是靈活的,因此變型也很多,感興趣的閱讀不妨參照一下歷史文獻(xiàn),最終介紹到此結(jié)束。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用python3調(diào)用wxpy模塊監(jiān)控linux日志并定時(shí)發(fā)送消息給群組或好友
這篇文章主要介紹了使用python3調(diào)用wxpy模塊,監(jiān)控linux日志并定時(shí)發(fā)送消息給群組或好友,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
Django數(shù)據(jù)庫(kù)操作的實(shí)例(增刪改查)
下面小編就為大家?guī)?lái)一篇Django數(shù)據(jù)庫(kù)操作的實(shí)例(增刪改查)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Python開(kāi)發(fā)之基于模板匹配的信用卡數(shù)字識(shí)別功能
這篇文章主要介紹了基于模板匹配的信用卡數(shù)字識(shí)別功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
深入解析python項(xiàng)目引用運(yùn)行路徑
這篇文章主要介紹了python項(xiàng)目引用運(yùn)行路徑的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Python的另外幾種語(yǔ)言實(shí)現(xiàn)
這篇文章主要介紹了Python的另外幾種語(yǔ)言實(shí)現(xiàn),本文介紹了CPython、Jython、Python for .NET、PyPy、Stackless等其它幾種語(yǔ)言實(shí)現(xiàn)的Python,需要的朋友可以參考下2015-01-01
python flask解析json數(shù)據(jù)不完整的解決方法
這篇文章主要介紹了python flask解析json數(shù)據(jù)不完整的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05
Keras搭建M2Det目標(biāo)檢測(cè)平臺(tái)示例
這篇文章主要為大家介紹了Keras搭建M2Det目標(biāo)檢測(cè)平臺(tái)實(shí)現(xiàn)的源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python語(yǔ)法之精妙的十個(gè)知識(shí)點(diǎn)(裝B語(yǔ)法)
本文精心篩選了最能展現(xiàn) Python 語(yǔ)法之精妙的十個(gè)知識(shí)點(diǎn),并附上詳細(xì)的實(shí)例代碼,需要的朋友可以參考下2020-01-01

