网络视频监控与人脸识别

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

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

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

关键部分解析:

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

  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通信方式发送

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

posted @ 2017-10-03 16:28  专注it  阅读(2178)  评论(0编辑  收藏  举报