网络视频监控与人脸识别

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

网络视频监控与人脸识别主要由三个程序组成: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.   
  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 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 三个值会比较接近。两个相邻的点,会有很多的色彩是很接近的,那么如何能在最后得到的图片中,尽量少得记录这些不需要的数据, 也即达到了压缩的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

esxi.主机配置上联端口_为什么现代的电脑机箱仍然具有USB 2.0端口?

esxi.主机配置上联端口With USB 3.0 becoming more prevalent with each passing year now, you may have found yourself wondering why modern computers still have USB 2.0 ports built into them. With that in mind, today’s SuperUser Q&A post has the answers to…

使用命令导入、导出mysql数据

1.导出全部数据库 利用mysqldump的—all-databases参数可以一口气把你数据库root用户下的所有数据库一口气导出到一个sql文件里。然后&#xff0c;重装系统后使用source命令可以再一口气倒回来。 需要确定mysql安装的路径&#xff1a;本机是&#xff1a;C:\Program Files\MySQL…

【原理图操作】原理图更新PCB时未改动元器件布局变动问题?

转载PCB布局、布线完工之后&#xff0c;由于设计功能&#xff0c;发现不完善时, 原理图部分功能需要改动&#xff0c;再改原理图&#xff0c;修改完成后&#xff0c;导入PCB过程中&#xff0c;发现PCB中未改动&#xff08;部分&#xff09;的元器件 布局发生了变化&#xff0c;…

关闭edge任务栏预览_如何在Microsoft Edge中关闭选项卡预览

关闭edge任务栏预览Now that it has extension support, Microsoft Edge is becoming a more and more viable browser. One feature people seem to either love or hate is the pop-up preview you get when you hover over a tab. There’s no built-in setting that lets y…

智能手机丢失 数据安全_丢失智能手机时该怎么办

智能手机丢失 数据安全Phones get stolen or lost everyday. With a plethora of data ripe for identity-theft on it, a lost phone can easily make your blood run cold. Take a deep breath, How-To Geek will talk you through this. 手机每天都会被盗或丢失。 随着大量用…

程序员怎样成为一名架构师?

在今天的技术圈&#xff0c;可能随便遇到一个人递给你一张名片&#xff0c;title 就是某某架构师。架构师多如过江之鲫&#xff0c;也正是眼下业内一个有趣的现象。对于架构师&#xff0c;你有什么看法&#xff1f;什么是架构师&#xff1f;随便打开某招聘网站&#xff1a;系统…

共享没有权限访问权限_如何与家人共享SmartThings访问权限

共享没有权限访问权限If you have multiple people in your household and want them all to have access to SmartThings from their phones, here’s how to share access to SmartThings with anyone you want. 如果您的家庭中有多个人&#xff0c;并且希望他们所有人都可以…

使用jquery+css实现瀑布流布局

虽然可以直接使用css实现瀑布流布局&#xff0c;但显示的方式有点问题&#xff0c;所以这儿就直接使用jquerycss来实现瀑布流布局&#xff0c;最终效果如下&#xff1a; 思路是通过将每个小块的position设置为relative&#xff0c;然后计算出在当前选择的列下应该上移的距离&am…

geek_How-To Geek正在寻找安全作家

geekThink you have the perfect combination of geek knowledge and writing skills? We’re looking for an experienced, security-focused writer to join our team. 认为您将怪胎知识和写作技能完美结合了吗&#xff1f; 我们正在寻找经验丰富&#xff0c;注重安全性的作…

AAC 文件解析及解码流程

OUTLINE&#xff1a; &#xff0a; AAC概述 &#xff0a; AAC规格简述 &#xff0a; AAC特点 &#xff0a; AAC音频文件解析 ——ADIF&#xff06;ADTS格式 ——ADIF&#xff06;ADTS头信息 ——ADIF&#xff06;ADTS数据信息 ——AAC文件处理流程 &#xff0a; AAC解码流程…

IntelliJ IDEA代码分屏显示

转载于:https://www.cnblogs.com/EasonJim/p/9124809.html

vscode重置应用程序_如何在Windows 10上重置应用程序的数据

vscode重置应用程序With Windows 10’s Anniversary Update, you can now reset an app’s data without actually uninstalling and reinstalling the app. This can fix problems when an app has gotten into a bad state, or just quickly restore an app to its default s…

程序报错与提示

2019独角兽企业重金招聘Python工程师标准>>> 我们在开发中, 为了程序的规范性,把报错级别,调的比较高NOTICE级别的也报出来,有助于我们快速定位错误和代码规范&#xff0c;但是,在产品上线后,网站运营过程中,就不宜报这么多错. 1:这种错误给客户的印象不好 2:在报错…

dock怎么自定义_如何自定义和调整Mac的Dock

dock怎么自定义The macOS dock normally appears at the bottom of your screen, but it doesn’t have to. The dock is customizable in quite a few ways you might not be aware of, especially if you’re a new Mac user. macOS坞站通常显示在屏幕底部&#xff0c;但不是…

ios 轻扫手势_轻扫即可快速删除iOS计算器中的数字

ios 轻扫手势iOS’ built-in calculator is a basic, simple-to-use calculator that’s very handy for doing some quick calculations, such as calculating the tip on your restaurant bill. It’s also useful for longer, more complicated calculations. However, ther…

游戏安全资讯精选 2017年第十期 英国彩票网遭遇DDoS攻击,中断90分钟 DNSMASQ多高危漏洞公告 阿里云协助警方破获国内最大黑客攻击案,攻击峰值690G...

【本周游戏行业DDoS攻击态势】 国庆期间&#xff0c;针对游戏行业的DDoS攻击放缓&#xff0c;攻击者也在放“小长假”&#xff0c;10月8日超过500G的攻击可视作攻击猛烈度恢复的表现。 【游戏安全动态】 英国彩票网遭遇DDoS攻击&#xff0c;中断90分钟 点击查看原文 点评&#…

02 jmeter 简单发送http请求

一、新建http请求模板1、测试计划2、右键Threads(users)-线程组3、右键sample-http请求4、右键监听器-查看结果树5、右键监听器-查看聚合报告二、编辑http请求内容三、设置并发用户1&#xff1a;虚拟用户数&#xff1b; 2&#xff1a;加载用户时间&#xff1b;3、每个用户循环次…

java调用siri 语言_如何更改Siri的声音,口音,性别和语言

java调用siri 语言Most of us are familiar with Siri as an American female voice. What you may not realize is that you can actually change Siri to have a different accent, gender, and language. 我们大多数人都熟悉Siri&#xff0c;这是一种美国女性声音。 您可能没…

mac word 设置语言_如何更改Mac的语言和区域设置

mac word 设置语言If you want to use your Mac in a different language, or you’re live in a different region, then you can change it in OS X. When you do, it’ll display everything in your preferred language, currency, date format, and more. 如果您想以其他语…

飞利浦dicom_如何按计划打开或关闭飞利浦色相灯

飞利浦dicomThe Philips Hue app can do a handful of cool stuff with your Hue lights, including the ability to schedule your lights to turn on and off at specific times throughout the day. Here’s how to set it up so that you never have to flip a switch ever…