前提:
在多個攝像頭分別位于完全不同的位置進行拍攝這個前提下,我們可以采用簡單的將不同攝像頭畫面進行逐幀拼接再進行目標檢測,追蹤來實作這個要求,
因為我們對視頻、攝像頭進行目標檢測、每個物件添加id并不是對視頻這個整體一次性地進行處理,而是將視頻進行while回圈來做到逐幀提取圖片,再對單張圖片進行畫面內的目標檢測,在利用多目標跟蹤技術進行單個物件的下一幀位置預測等等來保證單個物件id不變,
解決方案:
所以我們同時可以從輸入多個視頻源(或開啟多個攝像頭),在while回圈前
cap1 = cv2.VideoCapture(args.video_path1)
cap2 = cv2.VideoCapture(args.video_path2)
cap3 = cv2.VideoCapture(args.video_path3)
#略
#先引入多個視頻
在while回圈里,我們先通過判斷視頻源能否讀取到畫面,并加入輔助判斷變數
while True:
#略
bool1=False
bool2=False
bool3=False
#略
if cap1 != None:
success1, frame1 = cap.read()
if cap2 != None:
success2, frame2 = cap2.read()
if cap3 != None:
success3, frame3 = cap3.read()
#略
因為后續可能存在多個攝像頭中的一個攝像頭提前關閉,而其它的還在正常運轉,所以我們需要判斷哪個攝像頭提前結束了功能,success1、success2等本來是判斷該情況的變數,但假設我們在進行6個攝像頭的處理,那么我們的畫面應該從最開始到結束為止都有6塊區域,就算其中一塊區域攝像頭關閉了,在螢屏里那塊區域也仍應存在,可以采用黑屏,白屏等來代替原先的內容,
假設6個攝像頭中的第5個攝像頭提前關閉了,但是success5變數在關閉后的回圈里還是會一直處于true,而參考輔助變數bool5,則在之前為true后還可以為false
if success1:
x1 = frame1.size[0]
y1 = frame1.size[1]
img1 = cv2.resize(frame1, (x1, y1))
frame = img1 //假設只有一個攝像頭時我們就不用進行拼接操作,直接使用
if success2:
bool2 = True
x2 = frame2.size[0]
y2 = frame2.size[1]
img2 = cv2.resize(frame2, (x1, x2))
if success3:
bool3 = True
x3 = frame3.size[0]
y3 = frame3.size[1]
img3 = cv2.resize(frame3, (x1, x2))
#略
frame作為我們的最終處理圖片變數
以下進行逐幀拼接
# 二個視頻時
if success2 or bool2:
if success2 == False:
img2 = cv2.imread('black.jpg')
if success == False:
img1 = cv2.imread('black.jpg')
frame = np.hstack((img1, img2))
# 三個視頻時
if success3 or bool3:
if success2 == False:
img2 = cv2.imread('black.jpg')
if success3 == False:
img3 = cv2.imread('black.jpg')
if success == False:
img1 = cv2.imread('black.jpg')
imgblack = cv2.imread('black.jpg')
imgblack = cv2.resize(imgblack, (x1, x2)) #一張純黑的圖片,用于代替第四個攝像頭的缺失位置,達到2*2的最終生成格式,比較美觀
frame1 = np.hstack((img1, img2)) #橫向拼接
frame2 = np.hstack((img3, img5)) #橫向拼接
frame = np.vstack((frame1, frame2)) #縱向拼接
#略
最終,對frame這個圖片進行目標檢測,追蹤即可
注意:
如果不建立在上面的前提下,而是存在幾個攝像頭位于同一位置但位于不同角度,那會出現同一時刻同一個人以不同角度出現在我們的監控畫面中,那可能會導致id混亂,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287018.html
標籤:其他
下一篇:求PI的近似值(近似演算法)
