# C语言/ARM嵌入式-V4L视频监控系统
# 摘 要
随着数码相机和互联网的普及,使得人们的生活方式发生了改变。摄像头软件成为日常应用中必可少的应用软件之一,本次课程设计利用QT 设计了一款基于嵌入式视频服务器的监控系统,在linux2.6.30.4的内核基础上移植V4L2驱动模块并使用其API接口对摄像头进行设置和对所监控对象实时数据采集。系统采用TQ2440 开发板为硬件平台,在其上搭建LINUX 系统的网络视频服务器,用QT 为用户图形界面开发了客户端软件。客户端和服务端之间通过Socket通信,实现视频监控。其中在客户端连接上服务端之后,可以服务端发来的数据处理后作为图像显示在界面,提供了截图的功能、保存截图的功能。
**关键词**:Linux QT;通信;视频监控;V4L2
# 一、设计内容与要求
## 1.1 基础题设计内容及要求
- 编写程序将数组内容倒置a[]=”123456789”
- 创建两线程,A线程循环打印数组a[100],B线程循环将数组成员+1,要求利用互斥锁,使每次输出a[0]==a[99]
- 通过Makefile,将project中的两个.c编译成.a,另一个.c调用.a的函数,要求实现静态库的生成和调用,运行结果正确
## 1.2 V4L视频监控系统设计内容及要求
- 完成videodev.o驱动程序并编译成功
- 将驱动程序复制到用户目录
- 测试并运行成功摄像头监控
## 1.3 设计的实现方案
在实现的过程中,我们首先要在服务器端通过videodev.o驱动程序用于打开摄像头,其方法试是我们创建数据缓冲区和一个线程,这个线程用于采集视频,通过在视频采集函数中,将套接字加入socket中,监控数据中是否含有套接字,若有则创建另一个用于向客服端通过socket发送采集视频的线程,然后我们要运用虚拟机中的QT编译工具,对要实现的视频摄像头的基本界面进行设计,布局完成之后,再对各个模块进行进行信号与槽函数的实现,最后再对整体进行优化设计,使得编写好的软件能够顺利流畅的运行。
# 二、总体设计
## 2.1 视频监控系统的总体设计
Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,易于扩展,允许组件编程。服务器使用基于ARM9 的Qt2440开发板为硬件搭载平台和linux系统内核的软件平台。此视频监控系统主要由服务器、摄像头、客户端三部分模块组成。向操作系统内核移植了videodev.o驱动,并使用此来驱动网络摄像头模块,服务器对所采集到的视频数据提出来,并通过网口使用TCP/IP网络协议传输方式向客户端发送含有套接字socket的视频数据。如图所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/7563a4a9cb893cd0efdece9b3a3f7e77.writebug)
## 2.2 客户端设计
首先用QT Creator 创建文件,利用QT 工具画好整体的主界面,建立一个主窗口。然后在这个主窗口上方放置一个行编辑框用来输入服务器IP、端口号,下方进行视频监控显示。客户端主要是连接到服务器,在客户端连接上服务端之后,将服务器传过来的数据进行处理,将数据作为JDPG图像显示在界面上。客户可以实现对图片的截取、保存。客户端总体流程框图如图所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/0be17dac6de50bf80e5082607c666761.writebug)
## 2.3 服务器端设计
首先需要安装交叉编译器,将程序用arm-linux-gcc编译成适合TQ2440开发板下可运行的程序,并通过连接下载工具,使之在开发板上运行。服务器端总体流程图如图三所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/a5a0b5d5c49aa4e3d55fd47a6871b840.writebug)
# 三、具体分析
## 3.1 客户端具体设计
### 3.1.1 客户端主界面设计
QT 是一个支持多操作系统平台的应用程序开发框架,通过建立一个函数调用connect()函数把这个插槽和一个信号连接起来,这样就完成了一个事件和响应代码的连接。这里我们采用了多线程技术,主线程在主窗口绘图,实时显示监控视频;次线程建立TCP 连接,接收来自服务器的数据,当接收够一帧的数据后发射信号给主线程,让主线程来绘图。客户端的主要界面用到了控件labelVideo用于显示视频,btnConnect用于按钮connect,capture_btn用于按钮Captrue,显示端口和IP地址是用的txtPort和txtIP。主要界面如图所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/6d0d8ae0a9dc0001bd392fab7e90da57.writebug)
### 3.1.2 数据接收线程的设计
我们首先初始化并建立一个TCP 连接,当连接出错时,返回错误并提示。然后通过QTcpSocket 类的bytesAvailable()函数来判断是否有数据可读,若可读则通过该函数的返回值来判断这一帧有多少数据需要读。所以客户端接受来自服务器端发来的数据,数据是由摄像头采集而来的,数据以jepg图片的格式连接,所以在客户端要做的就是将每一张图片从数据中分离出来,而后将其显示在主界面的视频浏览框内。实现流程图如图五所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/82e3cf5b0fde3f724593b4e0c4a04aca.writebug)
其实现主要代码如下:
```c++
//读取数据
void MainWindow::readMesg() {
qba= tcpSocket->readAll();
for(int i = 0;i < qba.count();i++){
if(enRecv) imageBuff += qba[i];
if(lastbyte == (char)0xFF) {
if(qba[i] == (char)0xD8) {
qDebug()<<"START"<<endl;
enRecv = true;
}
```
## 3.2 服务器端具体设计
### 3.2.1视频采集模块的设计
视频的采集模块调用V4L,实现对原始视频数据的采集,其实现过程如下:先定义两个线程,一个线程用于采集视频,通过调用函数\*pthread_video来实现,其中在函数\*pthread_video里面又定义两个函数,一个是用于打开视频,开始采集,第二个函数对采集到的视频保存到数据缓冲区databufer中,另外一个线程用于发送采集到的视频,也是通过调用函数\*pthread_snd实现,首先等待客服端连接,如果连接成功,则将数据写到套接字newsd中。
当数据流采集成功后,通过文件描述符集fdsr来监听,客户端是否有连接,如果有连接则通过套接字socket发送给客户端。主要的具体代码如下:
```c++
void *pthread_video(void *arg)//视频采集函数
{
pthread_detach(pthread_self());//?
video_on();//打开视频,开始采集
databuf=(buf_t *)malloc(sizeof(buf_t)+buffers[0].length);//分配空间
while(1)
{
video();//采集数据,保存
}
// video_off();
return NULL;
}
void video_on()//打开视频,开始采集
{
enum v4l2_buf_type type;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl (fd, VIDIOC_STREAMON, &type) < 0)
{
printf("VIDIOC_STREAMON error\n");
// return -1;
}
}
void *pthread_snd(void *socketsd)//采集完数据,发送数据
{
pthread_detach(pthread_self());//让自己的线程不阻塞
int sd=((int )socketsd);
int newsd,ret,i=0;
newsd=accept(sd,NULL,NULL);//等待客服端连接,
if(newsd==-1)
{
perror("accept");
return NULL;
}
while(1)//如果连接成功,
{
pthread_mutex_lock(&g_lock);
pthread_cond_wait(&g_cond,&g_lock);
write(newsd,databuf->buf,databuf->datasize);//写数据到socket文件
if(ret==-1)
{
printf("client is out\n");
}
pthread_mutex_unlock(&g_lock);
}
return NULL;
}
`
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
29797300214404177.zip (49个子文件)
video-surveillance-system
src
Client
M 212KB
V 276KB
L 300KB
moc_mainwindow.cpp 2KB
T 276KB
K 300KB
mainwindow.h 899B
P 284KB
moc_mainwindow.o 136KB
Client.pro.user 24KB
image
1.jpg 24KB
3.jpg 24KB
Makefile 7KB
CONFIG
CONFIG.DAT 11B
mainwindow.o 247KB
Client 317KB
mainwindow.cpp 4KB
[ 212KB
. % 100KB
main.cpp 207B
O 284KB
mainwindow.ui 3KB
R 268KB
Camdata.txt 3.18MB
W 284KB
C 300KB
B 300KB
E 300KB
I 300KB
A 300KB
main.o 129KB
Q 212KB
S 268KB
ui_mainwindow.h 4KB
F 300KB
U 208KB
Client.pro 344B
N 212KB
J 300KB
video 11KB
D 300KB
X 284KB
G 300KB
Y 276KB
Z 272KB
H 300KB
2010441729-陈灵-V4L视频监控系统.doc 447KB
LICENSE 1KB
README.md 15KB
共 49 条
- 1
资源评论
工具盒子
- 粉丝: 0
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 937712277954201实习5.word
- 2程序语言基础知识pdf1_1716337722703.jpeg
- 简单的Python示例,演示了如何使用TCP/IP协议进行基本的客户端和服务器通信
- 考试.sql
- keil2 + proteus + 8051.exe
- 1961ee27df03bd4595d28e24b00dde4e_744c805f7e4fb4d40fa3f695bfbab035_8(1).c
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- windows注册表编辑工具
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- 校园通行码预约管理系统20240522075502
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功