明天又要去面试了,趁次机会也将以前做的东西总结一下,为以后理解提供方便,也再加深下印象。

网络视频监控与人脸识别主要由三个程序组成:1、视频采集与传输程序;2、接受与显示程序;3、人脸识别程序。下面就分别来分析一下这三个程序。

一、视频采集与传输程序(Servfox)

关键部分解析:

1、视频数据采集(可采用共享内存方式和读方式)

[cpp] view plaincopy
  1. int v4lGrab (struct vdIn *vd )
  2. {
  3. static    int frame = 0;
  4. int len;
  5. int size;
  6. int erreur = 0;
  7. int jpegsize = 0;
  8. struct frame_t *headerframe;
  9. double timecourant =0;
  10. double temps = 0;
  11. timecourant = ms_time();
  12. if (vd->grabMethod)  /*<strong>共享内存方式</strong>*/
  13. {
  14. vd->vmmap.height = vd->hdrheight;
  15. vd->vmmap.width = vd->hdrwidth;
  16. vd->vmmap.format = vd->formatIn;
  17. /*该函数成功返回则表示一帧采集已完成,采集到的图像数据放到
  18. 起始地址为 vd->map+vd->mbuf.offsets[vd->frame]
  19. 的内存区中,读取该内存区中的数据便可得到图像数据。
  20. 接着可以做下一次的 VIDIOCMCAPTURE。*/
  21. if (<strong>ioctl (vd->fd, VIDIOCSYNC, &vd->vmmap.frame</strong>) < 0)
  22. {
  23. perror ("cvsync err\n");
  24. erreur = -1;
  25. }
  26. /* Is there someone using the frame */
  27. while((vd->framelock[vd->frame_cour] != 0) && vd->signalquit)
  28. usleep(1000);
  29. pthread_mutex_lock (&vd->grabmutex);
  30. temps = ms_time();
  31. /*采集完成,进行jpeg压缩处理,里面大有文章*/
  32. jpegsize= <strong>convertframe</strong>(vd->ptframe[vd->frame_cour]+ sizeof(struct frame_t),
  33. vd->pFramebuffer + vd->videombuf.offsets[vd->vmmap.frame],
  34. vd->hdrwidth,vd->hdrheight,vd->formatIn,vd->framesizeIn);
  35. /*填充数据帧信息头*/
  36. headerframe=(struct frame_t*)vd->ptframe[vd->frame_cour];
  37. snprintf(headerframe->header,5,"%s","SPCA");
  38. headerframe->seqtimes = ms_time();
  39. headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);
  40. headerframe->w = vd->hdrwidth;
  41. headerframe->h = vd->hdrheight;
  42. headerframe->size = (( jpegsize < 0)?0:jpegsize);
  43. headerframe->format = vd->formatIn;
  44. headerframe->nbframe = frame++;
  45. // printf("compress frame %d times %f\n",frame, headerframe->seqtimes-temps);
  46. pthread_mutex_unlock (&vd->grabmutex);
  47. /************************************/
  48. if ((<strong>ioctl (vd->fd, VIDIOCMCAPTURE, &(vd->vmmap)</strong>)) < 0)
  49. {
  50. perror ("cmcapture");
  51. if(debug) printf (">>cmcapture err \n");
  52. erreur = -1;
  53. }
  54. vd->vmmap.frame = (vd->vmmap.frame + 1) % vd->videombuf.frames;
  55. vd->frame_cour = (vd->frame_cour +1) % OUTFRMNUMB;
  56. //if(debug) printf("frame nb %d\n",vd->vmmap.frame);
  57. }
  58. else     /* <strong>读方式</strong>*/
  59. {
  60. size = vd->framesizeIn;
  61. len = <strong>read</strong> (vd->fd, vd->pFramebuffer, size);
  62. if (len < 0 )
  63. {
  64. if(debug) printf ("v4l read error\n");
  65. if(debug) printf ("len %d asked %d \n", len, size);
  66. return 0;
  67. }
  68. /* Is there someone using the frame */
  69. while((vd->framelock[vd->frame_cour] != 0)&& vd->signalquit)
  70. usleep(1000);
  71. pthread_mutex_lock (&vd->grabmutex);
  72. temps = ms_time();
  73. jpegsize= convertframe(vd->ptframe[vd->frame_cour]+ sizeof(struct frame_t),
  74. vd->pFramebuffer ,
  75. vd->hdrwidth,vd->hdrheight,vd->formatIn,vd->framesizeIn);
  76. headerframe=(struct frame_t*)vd->ptframe[vd->frame_cour];
  77. snprintf(headerframe->header,5,"%s","SPCA");
  78. headerframe->seqtimes = ms_time();
  79. headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);
  80. headerframe->w = vd->hdrwidth;
  81. headerframe->h = vd->hdrheight;
  82. headerframe->size = (( jpegsize < 0)?0:jpegsize);
  83. headerframe->format = vd->formatIn;
  84. headerframe->nbframe = frame++;
  85. //  if(debug) printf("compress frame %d times %f\n",frame, headerframe->seqtimes-temps);
  86. vd->frame_cour = (vd->frame_cour +1) % OUTFRMNUMB;
  87. pthread_mutex_unlock (&vd->grabmutex);
  88. /************************************/
  89. }
  90. return erreur;
  91. }

2、数据通过socket通信方式发送

[cpp] view plaincopy
  1. for (;;)
  2. {
  3. memset(&message,0,sizeof(struct client_t));
  4. /*接受网络数据,保存在message 结构体中*/
  5. ret = read(sock,(unsigned char*)&message,sizeof(struct client_t));
  6. /*根据接受到的控制信息进行控制*/
  7. /*大小调节*/
  8. else if (message.updosize){ //compatibility FIX chg quality factor ATM
  9. switch (message.updosize){
  10. case 1: qualityUp(&videoIn);
  11. break;
  12. case 2: qualityDown(&videoIn);
  13. break;
  14. }
  15. ack = 1;
  16. }
  17. /*帧数调节*/
  18. else if (message.fps){
  19. switch (message.fps){
  20. case 1: timeDown(&videoIn);
  21. break;
  22. case 2: timeUp(&videoIn);
  23. break;
  24. }
  25. ack = 1;
  26. }
  27. /*睡眠控制*/
  28. else if (message.sleepon){
  29. ack = 1;
  30. }
  31. else ack =0;
  32. while ((frameout == videoIn.frame_cour) && videoIn.signalquit)   usleep(1000);
  33. if (videoIn.signalquit){
  34. videoIn.framelock[frameout]++;
  35. headerframe = (struct frame_t *) videoIn.ptframe[frameout];
  36. headerframe->acknowledge = ack;
  37. headerframe->bright = bright;
  38. headerframe->contrast = contrast;
  39. headerframe->wakeup = wakeup;
  40. /*发送数据帧头信息*/
  41. ret = write_sock(sock, (unsigned char *)headerframe, sizeof(struct frame_t)) ;
  42. if(!wakeup)
  43. /*发送数据帧信息*/
  44. ret = write_sock(sock,(unsigned char*)(videoIn.ptframe[frameout]+sizeof(struct frame_t)),headerframe->size);
  45. videoIn.framelock[frameout]--;
  46. frameout = (frameout+1)%4;
  47. } else {
  48. if(debug) printf("reader %d going out \n",*id);
  49. break;
  50. }
  51. }
  52. close_sock(sock);
  53. pthread_exit(NULL);
  54. }

二、接受与显示程序
1、JPEG图片压缩原理

实际上,一个平面的图像,可以理解为除了水平 X 和垂直 Y 以外,还有一个色彩值的 Z 的三维的系统。Z 代表了三元色中各个分支 R/G/B 的混合时所占的具体数值大小,每个像素的 RGB 的混合值可能都有所不同,各个值有大有小,但临近的两个点的 R/G/B 三个值会比较接近。两个相邻的点,会有很多的色彩是很接近的,那么如何能在最后得到的图片中,尽量少得记录这些不需要的数据, 也即达到了压缩的效果。

网络视频监控与人脸识别相关推荐

  1. 【智慧养殖解决方案】如何使用EasyGBS构建鱼塘养殖高清网络视频监控系统?

    一.方案背景 随着我国农业的快速发展,以及对新兴技术的应用,养殖业.农牧业.种植业等也面临着全新的挑战与机遇.如何与新兴技术结合,建立智能化的远程监控平台,实现高效管理.提高经济效益和市场竞争力? 以 ...

  2. 基于网络视频监控的人员考勤系统设计

    程序IT圈 学习编程技术,关注这个公众号足够了   本文是由公众号大数据AI之家投稿,转载需联系作者 . 一. 选题背景 考勤系统是现代机关单位和公司必备的系统.现在使用最多的考勤系统是打卡系统.指纹 ...

  3. 【解决方案】国标GB28181平台EasyGBS级联EasyCVR视频智能分析搭建“蓝天卫士”网络视频监控系统技术方案

    一.背景分析 当前,现代工农业的迅速发展在为社会创造了丰富的物质财富的同时,也对自然环境和人类健康造成了日益严重的危害,并导致了资源短缺.环境污染.生态破坏.随着中国经济环境的改善和能源环境结构调整, ...

  4. 无线网络视频监控系统基本概念和术语

    无线网络视频监控系统基本概念和术语 1.网络摄像机与模拟摄像机的区别 模拟摄像机,或称摄像头,输出CVBS模拟视频信号,PAL制或者NTSC制.模拟摄像机多采用CCD器件,目前也有采用CMOS器件的. ...

  5. dlibdotnet 人脸相似度源代码_使用dlib中的深度残差网络(ResNet)实现实时人脸识别 - supersayajin - 博客园...

    opencv中提供的基于haar特征级联进行人脸检测的方法效果非常不好,本文使用dlib中提供的人脸检测方法(使用HOG特征或卷积神经网方法),并使用提供的深度残差网络(ResNet)实现实时人脸识别 ...

  6. 视频监控系统智能识别分析

    视频监控系统智能识别分析通过Python基于YOLOv7对现场画面中人员行为以及物体的状态检测.目标检测架构分为两种,一种是two-stage,一种是one-stage,区别就在于 two-stage ...

  7. 网络视频监控系统解决方案概述

      随着视频监控方案的应用普及,视频监控已经与人们的生活越来越密切,而随着网络技术的发展,网络视频监控系统应用已经成为一种趋势.尤其是互联网.电视技术.通信技术开始融合以后,基于互联网平台的视频监控网 ...

  8. 弱电工程网络视频监控系统联网方式及接地要求

    前言: 网络视频监控系统如何组网?网络架构系统如何组成?这些都是作为一个安防监控行业的人都必须具备的能力,下面为了让大家更了解一下,整理一些相关资料和大家分享一下. 图源:图虫创意 弱电工程网络视频监 ...

  9. 光纤收发器在高清网络视频监控工程项目中的应用

    光纤收发器是一种将以太网的电信号和光信号进行互换的以太网传输媒质转换设备,也被称之为光电转换器.而在网络上传输数据的光纤分为多模光纤和单模光纤.接下来我们就来看下什么是单模光纤收发器,什么是多模光纤收 ...

最新文章

  1. JWT Authentication Tutorial: An example using Spring Boot--转
  2. Win10下如何更改默认浏览器
  3. jQuery入门[2]-选择器[转]
  4. Linux内核:容器底层cgroup如何使用
  5. Python语言数据类型-----数字和字符串
  6. 本科生手握十余篇SCI,达博士毕业要求后,他获顶级名校全奖直博offer
  7. gblfy_IDEA常用快捷键技巧
  8. php 5.4.5,PHP 5.4.5 和 5.3.15 发布
  9. OPhone的多媒体模块支持的三种不同数据源
  10. 【c++ primer5】重点知识总结
  11. 【https】 1 HTTP Security (bb102-1)
  12. 6种自动化测试框架(总有一款适合你)
  13. 沟通的艺术(笔记)——前言
  14. PDF Tools - PDF增强工具
  15. 学习Hadoop的前提条件
  16. 联想新一体机旁边的 USB 口插上没反应
  17. 【Gateway】服务网关--Gateway
  18. torch中manual_seed的作用
  19. 『分享』水平集算法简介(Level Set)
  20. 微信小程序页面跳转无效

热门文章

  1. session-cookie 和token登录验证
  2. 阿里云服务器ECS按ctrl+alt+delete无法登录
  3. SSIS 学习之旅 FTP访问类
  4. 《过早退出是一切失败的根源》读后感
  5. CSS 布局实例系列(四)如何实现容器中每一行的子容器数量随着浏览器宽度的变化而变化?...
  6. 子类能不能继承父类的构造方法?
  7. 利用JMeter进行压力测试(1)(转)
  8. w ndows7端口在哪里,win7电脑遇到端口被占用的情况该如何查看并将其关闭
  9. 由于开发者通过接口修改了菜单配置_开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?...
  10. python汇率编程_【菜鸟学Python】案例一:汇率换算