基于PXA270的视频监控系统 第7页
5 详细设计
本系统支持多平台多操作系统,对多种摄像头采集方法的支持,使用工厂模式进行封装,提供了统一的摄像头视频采集接口。如有新的采集方法,只需修改文件videocapturedevicefactory.cpp的内容即可。本系统的类层次结构如图5-1所示。 图5-1 系统类结构图
以下将对关键模块V4L1VideoCaptureDevice、VideoCaptureViewVMSMainWindow进行详细说明。
5.1图像采集模块设计v4l1videocapturedevice
此模块主要负责对OV511驱动的调用以及数据接收。为VideoCaptureView类的调用提供了包含图像数据的QImage对象。
5.1.1 ov511驱动初始化
定义函数void V4L1VideoCaptureDevice::setupCamera(QSize size)进行摄像头设备的初始化。以下语句实现了初始化的过程。
fd = open( VIDEO_DEVICE, O_RDWR );//打开设备
ioctl( fd, VIDIOCGCHAN, &chanInfo );//获得设备节点信息
pict.palette = VIDEO_PALETTE_RGB565;
if ( ioctl( fd, VIDIOCSPICT, &pict );//设置捕获图像颜色属性
ioctl( fd, VIDIOCGWIN, &wind );//获取捕获的视频尺寸信息
ioctl( fd, VIDIOCSWIN, &wind );//将修改好的视频尺寸信息回写到设备
ioctl( fd, VIDIOCGMBUF, &mbuf ) ;
frames=(unsigned char *)mmap(0,mbuf.size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0 );
//通过映射得到视频驱动的数据缓冲,然后直接对映射后的缓冲进行读操作
currentFrame = 0;
capture.frame = currentFrame;
capture.width = width;
capture.height = height;
apture.format = VIDEO_PALETTE_RGB565;
ioctl( fd, VIDIOCMCAPTURE, &capture );//获取第一帧
5.1.2获取帧过程
定义void V4L1VideoCaptureDevice::getCameraImage( QImage& img, bool copy )函数从驱动设备获取图像数据,并将数据向形参的QImage对象写入。
img=QImage(frames+mbuf.offsets[frame],width,height,QImage::Format_RGB16 );
其中frames为驱动数据的内存映射的首地址, mbuf.offsets[frame]为偏移地址,frame为帧数。由于ov511可同时获取两帧的数据,所以在数据的存储空间中会有两帧的图像,需要有frame来指定当前的指针位置。QImage::Format_RGB16定义了返回的QImage对象的颜色属性。
5.2图像处理模块设计videocaptureview
此模块主要负责对已接收的数据进行处理和显示.
5.2.1图像显示方法
在初始化的时候开始一个qt的时间事件
m_tidUpdate = startTimer(m_capture->minimumFramePeriod());
其中m_capture为摄像头传输类v4l1videocapturedevice的一个对象,minimumFramePeriod()返回的是摄像头的最小捕获图像周期。
在qt的时间触发函数中令每个计时结束时重绘窗口:
void VideoCaptureView::timerEvent(QTimerEvent*)
{
repaint();//调用VideoCaptureView::paintEvent
}
在qt的窗口绘制函数void VideoCaptureView::paintEvent(QPaintEvent* paintEvent)中获取包含摄像头捕获的图像数据的QImage类对象,并用painter.drawImage语句绘制视频窗口。
5.2.2动态侦测方法
内嵌到VideoCaptureView类里面,当每一个图像完成绘图后,保存当前图像,并且获取新的一帧图像。之后对需要监控的图像区域,按系统设定的横向像素间距和纵向像素间距进行遍历比较,每次比较将每个点的R、G、B三个颜色分量分离开,分别求差后去绝对值,之后将差累和,直至所有像素比较完成。
在得到了所有像素点的差的绝对值的累和后,系统将此值除以比较过的所有像素点。
p=(RegionalW*RegionalH)/(GapH*GapW);
TotalAVG=DifSum/p;
RegionalW为比较的区域宽度,RegionalH为比较的区域高度,GapH为遍历的纵向像素间隔,GapW为遍历的横向像素间隔。此算式求出在此次计算中遍历的像素点的数量和。
if(TotalAVG>Diflim){emit imgChanged();}
判断求的的平均像素差值,将其与阀值比较,若是大于阀值则向主控台发送一个信号槽,进行截图与信息保存。
5.3主窗口模块设计vmsmainwindow
本类主要对各个模块进行整合以及显示,提供了人机交互界面。
5.3.1视频显示窗口加载
在主窗口显示的时候创建了一个视频模块camerabase的实例,里面包含了一个视频处理模块videocaptureview的实例以及包含了一个视频采集类v4l1videocapturedevice的实例,之后系统调用摄像头的图像数据,并将其不断的刷新到主控台的视频窗口里。这部分通过以下语句实现。
camera = new Ui::CameraBase();
camera->setupUi(cameraWidget);
if ( camera->videocaptureview->available() ) {
camera->video->setEnabled( false );
}
5.3.2视频截图方法
由于摄像头的每一帧视频数据都是作为QImage类的对象在系统中传输,所以使用QImage的save()函数可以实现对当前图像的保存。
file.append(QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss") );//将当前的时间加入到文件名中
file.append( ".png" );//将扩展名加入到文件名中
QImage img = camera->videocaptureview->image();//获得当前图像
img.save( storagePath+"/photos/"+file, "PNG");//使用save()方法保存到指定路径
5.3.3动态侦测截图方法
在视频截图方法的基础上,在动态侦测算法中设定当图像出现变化时候便抛的一信号在主控窗口上被截获,之后触发视频截图方法,这部分由一个信号槽完成。
Connect(camera->videocaptureview, SIGNAL(imgChanged()),this, SLOT( takePhoto()));
5.3.4系统GUI设计
通过声明QT提供的QDialog、QLabel、QPushButton等类的对象,实现系统的操作界面。最终实现界面如图5-2。
dialog=new QDialog(CameraBase);//参数调整对话框。
....
thumb1 = new ThumbButton(CameraBase);//显示截图的小窗口1
Thumb2 = new ThumbButton(CameraBase);//显示截图的小窗口2
Thumb3 = new ThumbButton(CameraBase);//显示截图的小窗口3
Thumb4 = new ThumbButton(CameraBase);//显示截图的小窗口4
....
VideoCaptureView *videocaptureview;//显示视频窗口。
....
QVBoxLayout *vboxLayout;//布局管理器,实现窗口排版
....
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页
基于PXA270的视频监控系统 第7页下载如图片无法显示或论文不完整,请联系qq752018766