zoukankan      html  css  js  c++  java
  • 网络视频监控与人脸识别

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

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

  • 相关阅读:
    实现反转函数,即反转一个Null结尾的字符串
    给定两个字符串,确定其中一个字符串的字符重新排列后,能否变成另一个字符串
    IDL 常用字符串处理函数
    IDL创建进度条
    python中f'{}'用法
    Win10 pycharm中显示PyTorch tensorboard图
    torch.cat()和torch.stack()
    运筹学笔记6初始可行基
    运筹学笔记5单纯形法
    运筹学笔记4线性规划问题的几何特征
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/7623917.html
Copyright © 2011-2022 走看看