- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
要实现远程视频监控功能,远程监控系统大致可以分为三部分:
1)监控端:主要由摄像头组成,用来采集图像数据等视频信号送到中心控制部分。
2)中心控制部分:整个远程监控的核心,一个web server网络视频服务器,用来负责将监控端的摄像头采集的视频图像数据信号进行压缩与网络传输。整个过程不需要PC机的协助而独立进行工作。
3)客户端:局域网或者Internet上的用户通过专用软件或者浏览器访问视频服务器中的视频。具体工作流程:摄像头将输入图像数据经片内JPEG压缩引擎压缩后,通过内置的USB控制器和外接的USB收发器经USB总线送往嵌入式开发板。嵌入式开发板将从USB主接口接收到的数据传输到摄像头驱动缓冲区中。图像采集程序采集图像数据送入视频服务器,视频服务器负责网络传输,客户端利用专门软件或浏览器实时显示摄像头端采集的视频。
项目过程:
最开始完成的是通过摄像头捕捉画面,并将捕捉到的视频在板子上显示出来。首先是实现采集一帧的视频数据,并写入到一个允许读写的二进制文件中,就得到了摄像头采集到的Jpeg格式的图片画面。然后就是通过连续的采集得到多张画面并不停的刷新。
整个视频采集流程是基于V4L2的视频采集。V4L2(Video for Linux )是Linux 内核中关于视频设备的子系统,它为linux 下的视频驱动提供了统一的接口,使得应用程序可以使用统一的API 函数操作不同的视频设备,极大地简化了视频系统的开发和维护。V4L2 的绝大部分功能是通过ioctl 系统调用完成的,其语法为:ioctl(int fd, int request, void *argp)
具体操作流程如下:
1)打开设备进行设定,通过使用标准的文件打开函数操作;
2)查询图像缓冲区信息并设定;VIDIOCSFBUF主要是设定图像缓冲区的
基地址和缓冲区大小;
3)查询图像截取窗口信息并设定:VIDIOCGWIN和VIDIOCSWIN主要设
定截取图像尺寸和位置;
4)查询通道信息并设定,可以从一个或者多个通道捕获数据,来进行通道
的查询设定函数VIDEOCGCHAN和VIDEOCSCHAN;
5)获取图像并存放在缓冲区。
用mmap方式,直接将设备文件/dev/vide00映射到内存中,不需要额外
的对数据缓冲区进行复制工作,加快了图像信息的捕捉速度。另外,mmap0系
统调用使得进程之间通过映射同一文件实现共享内存,各个进程可以像访问普
通内存一样对文件进行访问,访问时只需要使用指针而不用调用文件操作函数。
视频采集流程图:
实现循环采集图像
#include stdio.h
#include string.h
#include errno.h
#include fcntl.h
#include sys/mman.h
#include linux/videodev.h
//#define ANDROID_ENV
#ifdef ANDROID_ENV
#define LOG LOGV
#else
#define LOG //
#endif
#define CAMERA_DEVICE /dev/video0
#define CAPTURE_FILE 1.txt
#define VIDEO_WIDTH 640
#define VIDEO_HEIGHT 480
#define VIDEO_FORMAT V4L2_PIX_FMT_YUYV
#define BUFFER_COUNT 1
struct fimc_buffer {
int length;
void *start;
} framebuf[BUFFER_COUNT];
int main()
{
int i, ret;
int j,k,n,m;
char name[10]={0};
int flag=1;
// Open Device
int fd;
fd = open(CAMERA_DEVICE, O_RDWR, 0);
if (fd 0)
{
LOG(Open %s failed/n, CAMERA_DEVICE);
return -1;
}
// Query Capability
struct v4l2_capability cap;
ret = ioctl(fd, VIDIOC_QUERYCAP, cap);
if (ret 0)
{
LOG(VIDIOC_QUERYCAP failed (%d)/n, ret);
return ret;
}
// Print capability infomations
/*
LOG(Capability Informations:/n);
LOG( driver: %s/n, cap.driver);
文档评论(0)