多摄像头/跨境头多目标跟踪的简单实现

分为两个部分:①一个是简单的多视频逐帧拼接;②另一个是全景融合可以达到两个视频彻底合为一个。

①:

前提:

在多个摄像头分别位于完全不同的位置进行拍摄这个前提下,我们可以采用简单的将不同摄像头画面进行逐帧拼接再进行目标检测,追踪来实现这个要求。

因为我们对视频、摄像头进行目标检测、每个对象添加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://blog.csdn.net/qq_28901541/article/details/83445399
https://www.zhihu.com/question/34535199/answer/135169187
具体是使用opencv的stitcher等进行缝合

你可能感兴趣的:(Python,python,目标跟踪,深度学习,paddlepaddle)