当前位置: 首页 > news >正文

网络视频监控与人脸识别

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

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

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

关键部分解析:

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

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


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

[cpp] view plain copy
  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 三个值会比较接近。两个相邻的点,会有很多的色彩是很接近的,那么如何能在最后得到的图片中,尽量少得记录这些不需要的数据, 也即达到了压缩的效果。

转载于:https://www.cnblogs.com/wanghuaijun/p/7623917.html

相关文章:

  • 混合和过度绘制(图层性能 15.3)
  • 【u235】背单词
  • [置顶] 九月半集训总结
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • IntelliJ IDEA之版本控制
  • 【Python】【正则】
  • SharePoint REST API - 使用REST API和jQuery上传一个文件
  • localStorage小结
  • scrum学习心得
  • Mysql字符集设置
  • httpclient连接池
  • JS判断键盘是否按的回车键并触发指定按钮点击操作
  • 根据ip抓 包
  • Mac下Tomcat安装配置80默认端口设置
  • Jzoj4699 Password
  • 【mysql】环境安装、服务启动、密码设置
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 11111111
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • bearychat的java client
  • js ES6 求数组的交集,并集,还有差集
  • Python实现BT种子转化为磁力链接【实战】
  • unity如何实现一个固定宽度的orthagraphic相机
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue2 SSR 的优化之旅
  • 从0到1:PostCSS 插件开发最佳实践
  • 简单实现一个textarea自适应高度
  • 利用DataURL技术在网页上显示图片
  • 前端性能优化——回流与重绘
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 《天龙八部3D》Unity技术方案揭秘
  • MPAndroidChart 教程:Y轴 YAxis
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 仓管云——企业云erp功能有哪些?
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (06)Hive——正则表达式
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (翻译)terry crowley: 写给程序员
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)德国人的记事本
  • (转)一些感悟
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .Net 6.0 处理跨域的方式
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net 程序发生了一个不可捕获的异常