一、全景融合系统整体设计方案
1.1 全景拼接模块
该模块主要获取每个摄像机视场在全景底图下的位置信息,从而获得矩阵变换参数,并且将这些参数传输到服务器当中,存入切分节点数据库中。
1.2 服务器模块
该模块主要是用于设计数据库保存所用的数据,让计算节点能够从这里领取任务。
1.3 中控模块
主要从服务器中的切分节点数据库中获取参数信息,然后人工选择需要播放的位置,将每个节点对应的底图和融合节点对应的信息传动到服务器的数据库当中。
1.4 流媒体服务器模块
主要用于推流rtmp,计算节点对这些获取到的视频流进行处理。这里也可以是从网络上获取的实时的rtsp的视频流。
1.5 计算节点
每个计算节点从服务器中领取其对应的任务,包括获取该节点对应的视频流,将这些视频进行解码,然后进行变换,和底图相融合生成新的视频帧,将这个图像显示到视频当中。这里每个计算节点只能处理一路视频流。
二、服务器的设计与实现
2.1 数据库的设计
2.1.1 切分节点数据库设计
字段 | 字段类型 | 说明 | 重要程度 |
---|---|---|---|
id | Int | 摄像机唯一标识 | 重要 |
ip | char(30) | 摄像机IP地址 | 重要 |
x | decimal(10) | 摄像机位置经度 | 重要 |
y | decimal(10) | 摄像机位置纬度 | 重要 |
xa | decimal(10) | 投影变换后的坐标位置 | 重要 |
ya | decimal(10) | 重要 | |
xb | decimal(10) | 重要 | |
yb | decimal(10) | 重要 | |
xc | decimal(10) | 重要 | |
yc | decimal(10) | 重要 | |
xd | decimal(10) | 重要 | |
yd | decimal(10) | 重要 | |
cuttingXList | char(40) | 不重要 | |
cuttingYList | char(40) | 不重要 | |
TransformMat | char(100) | 投影变换矩阵 | 重要 |
toploMat | char(40) | 不重要 | |
detectionWeight | file() | 不重要 |
2.1.2 图像数据库设计
这里是指每个屏幕的背景图片
字段 | 字段名称 | 字段类型 | 备注 |
---|---|---|---|
id | 处理节点的编号 | Int | |
ip | 处理节点的IP信息 | char(30) | 这里的IP是指小电脑对应的信息 |
image | 每个处理节点的底图信息 | ImageField() | |
isimagechange | 这些图片是否发生变化 | char(4) |
2.1.3 融合节点数据库设计
字段 | 字段类型 | 说明 |
---|---|---|
id | Int | 融合节点唯一标识符 |
ip | char(30) | 融合节点的ip地址 |
toploMat | char(100) | 其对应的视频流地址 |
position | char(80) | 位置 |
fourpoints | char(400) | 四个对应的点 |
ispointchange | BooleanField |
2.2 Django框架的实现
这里采用django框架来实现,为了实现restful的设计风格,实现前后端的分立,采用restfarmework来实现。
2.2.1 数据库的实现models.py
from django.db import models
def user_directory_path(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (instance.ip, ext)
return '{0}/{1}'.format('detection', filename)
class CuttingNode(models.Model):
id=models.IntegerField(blank=True, default='',primary_key=True)
ip=models.CharField(max_length=30, blank=True, default='',unique=True)
x=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
y=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
xa=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
ya=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
xb=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
yb=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
xc=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
yc=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
xd=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
yd=models.DecimalField(max_digits=10,decimal_places=3, blank=True, default='')
cuttingXList=models.CharField(max_length=40, blank=True,default='')
cuttingYList=models.CharField(max_length=40, blank=True,default='')
transformMat=models.CharField(max_length=100, blank=True,default='')
toploMat=models.CharField(max_length=40, blank=True, default='')
detectionWeight = models.FileField(upload_to=user_directory_path, blank=True, null=True)
class Image(models.Model):
id=models.IntegerField(blank=True, default='',primary_key=True)
ip=models.CharField(max_length=30, blank=True, default='',unique=True)
image=models.ImageField(upload_to='photo')
isimagechange=models.CharField