攝像頭調(diào)用
創(chuàng)建視頻捕捉對(duì)象:cv2.VideoCapture()
參數(shù)為視頻設(shè)備的索引號(hào),就一個(gè)攝像投的話寫0默認(rèn);
或者是指定要讀取視頻的路徑。
+實(shí)時(shí)播放
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
# 創(chuàng)建循環(huán)結(jié)構(gòu)連續(xù)按幀讀取視頻
while (True):
# ret返回布爾值,frame三維矩陣(每一幀的圖像)
ret, frame = cap.read()
# 并展示
cv2.imread('frame', frame)
# 按下‘q’鍵退出循環(huán)
if cv2.waitKey(1) && 0xFF ==ord('q'):
break
cap.release() # 釋放資源
cv2.destroyAllWindows()
+保存視頻
cv2.VideoWriter()
import cv2
cap = cv2.VideoCapture(0)
#創(chuàng)建編碼方式
# mp4:'X','V','I','D'
# avi:'M','J','P','G'或'P','I','M','1'
# flv:'F','L','V','1'
fourcc = cv2.VideoWriter_fourcc('X','V','I','D')
# 創(chuàng)建VideoWriter對(duì)象
out = cv2.VideoWriter('ouput_1.mp4', fourcc, 20.0, (640, 480)) # 播放幀率,大小
# 創(chuàng)建循環(huán)結(jié)構(gòu)進(jìn)行連續(xù)讀寫
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) && 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destryAllWindows()
運(yùn)動(dòng)目標(biāo)識(shí)別
幀差法
通過(guò)對(duì)視頻中相鄰兩幀圖像做差分運(yùn)算來(lái)標(biāo)記運(yùn)動(dòng)物體,
移動(dòng)的物體在相鄰幀中灰度會(huì)有差別,因此差值為0的是靜態(tài)物體。
import cv2
camera = cv2.VideoCapture("move_detect.flv")
out_fps = 12.0 # 輸出文件的幀率
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2') # 創(chuàng)建編碼方式
# 創(chuàng)建VideoWriter對(duì)象
out1 = cv2.VideoWriter('v1.avi', fourcc, out_fps, (500, 400))
out2 = cv2.VideoWriter('v2.avi', fourcc, out_fps, (500, 400))
# 初始化
lastFrame = None
# 創(chuàng)建循環(huán)結(jié)構(gòu)進(jìn)行連續(xù)讀寫
while camera.isOpened():
ret, frame = camera.read()
# 如果不能抓取到一幀,說(shuō)明到了視頻的結(jié)尾
if not ret:
break
# 調(diào)整該幀大小
frame = cv2.resize(frame, (500, 400), interpolation = cv2.INTER_CUBIC)
# 如果第一幀是None,對(duì)其初始化
if lastFrame == None:
lastFrame = frame
continue
# 求幀差
frameDelta = cv2.absdiff(lastFrame, frame)
lastFrame = frame
'''
閾值化,留下輪廓
'''
thresh = cv2.cvtColor(frameDelta, cv2.COLOR_BGR2GRAY) # 灰度圖
thresh = cv2.threshold(thresh, 25, 255, cv2.THRESH_BINARY)[1] # 二值化
# 閾值圖像上的輪廓位置
cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍歷輪廓
for c in cnts:
# 忽略小輪廓,可能運(yùn)動(dòng)的小鳥之類的,排除誤差
if cv2.contourArea(c) < 300:
continue
# 畫輪廓邊界框
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 展示當(dāng)前幀
cv2.imshow("frame", frame)
cv2.imshow("frameDelta", frameDelta)
cv2.imshow("thresh", thresh)
# 保存視頻
out1.write(frame)
out2.write(frameDelta)
if cv2.waitKey(20) && 0xFF == ord('q'):
break
# 資源釋放
out1.release()
out2.release()
camera.release()
cv2.destroyAllWindows()
飄動(dòng)的彩帶也被捕捉到了,但是去誤差,沒(méi)有標(biāo)小輪廓;
行人前后幀(運(yùn)動(dòng))幅度小的也沒(méi)被發(fā)現(xiàn)(框定)。
背景減除法
對(duì)視頻的背景進(jìn)行建模,實(shí)現(xiàn)背景消除,生成mask圖像,通過(guò)對(duì)mask二值圖像分析實(shí)現(xiàn)對(duì)前景活動(dòng)對(duì)象的區(qū)域的提取。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-679610.html
- 初始化背景建模對(duì)象GMM
- 讀取視頻一幀
- 使用背景建模消除生成mask
- 對(duì)mask進(jìn)行輪廓分析圖區(qū)ROI(region of interest)
- 繪制ROI對(duì)象
import numpy as np
import cv2
# read the video
camera = cv2.VideoCapture('move_detect.flv')
# 創(chuàng)建背景減除對(duì)象
fgbg = cv2.createBackgroundSubstractorMOG2(
history = 500, varThreshold = 100, detectShadows = False)
def getPerson(image, opt=1):
# 獲取前景mask
mask = fgbg.apply(frame)
'''
去噪
'''
# 創(chuàng)建一個(gè)矩形形狀的結(jié)構(gòu)元素,用于形態(tài)學(xué)操作,如腐蝕(erosion)和膨脹(dilation)
line = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 5), (-1, -1))
mask = cv2.morphologyEx(mask, cv2.MORPG_OPEN, line)
cv2.imshow('mask', mask)
# 畫出輪廓并忽略小于閾值的輪廓
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
area = cv2.contourArea(c)
if area < 150:
continue
rect = cv2.minAreaRect(c) # 返回一個(gè)具有最小面積的矩形
cv2.ellipse(image, rect, (0, 0, 255), 2, 8)
cv2.circle(image, (np.int32(rect[0][0]), np.int32(rect[0][1])), 2, (0, 0, 255), 2, 8, 0) # 取矩形中心點(diǎn)作為圓心
return image, mask
while True:
ret, frame = camera.read()
res, m_ = getPerson(frame) # Python中使用下劃線作為占位符變量名是一種慣例。它也可以用來(lái)忽略函數(shù)的返回值或迭代中的某些值,以避免產(chǎn)生未使用變量的警告
cv2.imshow('res', res)
if cv2.waitKey(20) && 0xFF == ord('q'):
break
# 資源釋放
camera.release()
cv2.destroyAllWindows()
圖像論1幀,連續(xù)幀就成了視頻文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-679610.html
到了這里,關(guān)于攝像頭的調(diào)用和視頻識(shí)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!