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

①:

前提:

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

因为我们对视频、摄像头进行目标检测、每个对象添加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=Falsebool2=Falsebool3=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 = Truex2 = frame2.size[0]y2 = frame2.size[1]img2 = cv2.resize(frame2, (x1, x2))
if success3:bool3 = Truex3 = 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等进行缝合

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

  1. 智能交通组合拳--飞桨实现车辆类别/车牌/车速检测、跨境头跟踪、车流密度检测、逆行检测

    智能交通组合拳–飞桨实现车辆类别/车牌/车速检测.跨境头跟踪.车流密度检测.逆行检测 总体简介 这个项目的代码和文件全部都已经上传到百度aistudio上,有需要的伙伴的可以搜索下面的链接找到,那里已 ...

  2. C#摄像头实现拍照功能的简单代码示例

    C#摄像头实现拍照功能的简单代码示例 2009-11-20  来自:网上整理字体大小:[大中小] ·摘要:这里将介绍一个C#摄像头实现拍照功能的简单代码示例,代码虽然不短,但是基本上实现了相对应的功能 ...

  3. 摄像头Optical Center检测算法简单实现

    摄像头Optical Center检测算法简单实现 光线通过透镜时,都会产生偏折,使光线传播方向发生变化:但透镜上有一点,任意方向的光线通过该点时,光线的传播方向不变,即出射方向和入射方向相互平行,这 ...

  4. 一个基于OpenCV的Python程序,可以从摄像头捕获图像并识别简单数字。您可以根据需要进行调整,包括调整图像预处理和数字识别逻辑

    一个基于OpenCV的Python程序,可以从摄像头捕获图像并识别简单数字.您可以根据需要进行调整,包括调整图像预处理和数字识别逻辑 import cv2 import numpy as np imp ...

  5. C# 跨线程赋值的简单做法

    通常,C#是不许跨线程赋值的,如:Form1中有个textbox, 若开辟一个新的线程来给 这个textbox赋值时,会出现异常. MSDN中提出了具体的做法,较为繁琐,就不说了. 我这里有个简单办法 ...

  6. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)

    二.跨域: 回到顶部 跨域知识介绍: 点我以前博客 跨域解决方法:CORS:跨域资源共享 CORS请求分类(简单请求和非简单请求) 简单请求(simple request):只需要在头信息之中增加一个 ...

  7. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(一)

    阅读目录 一.Django中的缓存: 前戏: Django中的几种缓存方式: Django中的缓存应用: 二.跨域: 跨域知识介绍: CORS请求分类(简单请求和非简单请求) 示例: 三.自动生成接口 ...

  8. HarmonyOS IDE再升级,跨终端开发真的简单了吗?

    . 一直以来,跨终端开发便如拦路虎一般横亘于开发者面前,从UI到后台,从图片到数据,都让人难以把控.而凭借分布式用户程序框架.Ability框架和UI框架,HarmonyOS为开发者提供了可分可合可流 ...

  9. IPCInvoker,Android跨进程调用如此简单

    一个APP为什么需要多条进程? 如果一条进程能够拥有足够多的资源,且不会被系统kill掉的话,让程序运行在一条进程上是最好的选择.但是系统资源是按进程来分配的,每条进程资源分配是有个上限的,而且当我们 ...

最新文章

  1. 职场PUA到底有多可怕?
  2. 【win32汇编】0x01 开篇一些乱七八糟的话
  3. cassandra可视化工具_程序员绘图工具——PlantUML
  4. ElasticSearch logo 分布式搜索引擎 ElasticSearch
  5. android 7.0 禁止 imei,Android一些适配
  6. MATLAB每个字母等宽,等宽文本文件的导入选项对象
  7. pythontkinter显示表格_详谈Python 窗体(tkinter)表格数据(Treeview)
  8. 网络之路--【第六章】——ICMP协议
  9. Python开发Http代理服务器 - socketref,呆在autonavi.com - C++博客
  10. word文档在程序未响应的情况下强行关闭未保存怎么恢复?
  11. 目前常用计算机配置,电脑常见主要配置、参数
  12. android wifi dns设置在哪,WiFi高级设置DNS在哪
  13. PPASR流式与非流式语音识别
  14. 工业软件开发-odoo
  15. python日常实用技能:使用python将大量数据导出到Excel中的
  16. Ubuntu安装repo
  17. 武林高手?敏捷开发,唯velocity取胜
  18. zlg72128数码管驱动管理显示芯片
  19. 游戏全区全服和分区分服 QQ斗地主的设计
  20. PySCIPOpt常用函数功能介绍(一)

热门文章

  1. java 判断文件是否可读_如何检查文件在Java中是否可读,可写或可执行?
  2. 不同实验样品在实时荧光定量PCR检测中要求有哪些?
  3. 故障电弧融合特征算法
  4. 去看了美腿大赛的最新图片之后....
  5. 企业微信开发总结-获取通讯录
  6. ChirpStack 学习笔记 2.8.1 ChirpStack 容器连接本机 InfluxDB 容器的一个典型问题处理
  7. 为Mac Terminal设置代理--没试,留着备用。
  8. 云开发多端用户模块实战(五)---uni-app基础(三)---uni-app组件简略使用
  9. 微信在线客服电话转人工
  10. ## 2020年度学期计划