生活随笔
收集整理的這篇文章主要介紹了
网络视频监控与人脸识别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
明天又要去面試了,趁次機會也將以前做的東西總結一下,為以后理解提供方便,也再加深下印象。
網絡視頻監控與人臉識別主要由三個程序組成:1、視頻采集與傳輸程序;2、接受與顯示程序;3、人臉識別程序。下面就分別來分析一下這三個程序。
一、視頻采集與傳輸程序(Servfox)
關鍵部分解析:
1、視頻數據采集(可采用共享內存方式和讀方式)
[cpp] view plaincopy
int?v4lGrab?(struct?vdIn?*vd?)?? {?? ??static????int?frame?=?0;???????? ??int?len;?? ??int?size;?? ??int?erreur?=?0;?? ??int?jpegsize?=?0;?? ?? ??struct?frame_t?*headerframe;?? ??double?timecourant?=0;?? ??double?temps?=?0;?? ??timecourant?=?ms_time();?? ???? ??if?(vd->grabMethod)?? ????{?? ??????vd->vmmap.height?=?vd->hdrheight;?? ??????vd->vmmap.width?=?vd->hdrwidth;?? ??????vd->vmmap.format?=?vd->formatIn;?? ???????? ????? ??????if?(<strong>ioctl?(vd->fd,?VIDIOCSYNC,?&vd->vmmap.frame</strong>)?<?0)???? ?? ????{?? ??????perror?("cvsync?err\n");?? ??????erreur?=?-1;?? ????}?? ??????? ???? ????while((vd->framelock[vd->frame_cour]?!=?0)?&&?vd->signalquit)?? ????usleep(1000);?? ????pthread_mutex_lock?(&vd->grabmutex);?? ?????????temps?=?ms_time();?? ???? ?????jpegsize=?<strong>convertframe</strong>(vd->ptframe[vd->frame_cour]+?sizeof(struct?frame_t),?? ????????????vd->pFramebuffer?+?vd->videombuf.offsets[vd->vmmap.frame],?? ????????????vd->hdrwidth,vd->hdrheight,vd->formatIn,vd->framesizeIn);?? ???? ?????headerframe=(struct?frame_t*)vd->ptframe[vd->frame_cour];?? ?????snprintf(headerframe->header,5,"%s","SPCA");??? ?????headerframe->seqtimes?=?ms_time();?? ?????headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);??? ?????headerframe->w?=?vd->hdrwidth;?? ?????headerframe->h?=?vd->hdrheight;?? ?????headerframe->size?=?((?jpegsize?<?0)?0:jpegsize);?? ?????headerframe->format?=?vd->formatIn;?? ?????headerframe->nbframe?=?frame++;??? ???? ?????? ????pthread_mutex_unlock?(&vd->grabmutex);??? ???? ?????? ??????if?((<strong>ioctl?(vd->fd,?VIDIOCMCAPTURE,?&(vd->vmmap)</strong>))?<?0)?? ????{?? ??????perror?("cmcapture");?? ??????if(debug)?printf?(">>cmcapture?err?\n");?? ??????erreur?=?-1;?? ????}?? ??????vd->vmmap.frame?=?(vd->vmmap.frame?+?1)?%?vd->videombuf.frames;?? ??????vd->frame_cour?=?(vd->frame_cour?+1)?%?OUTFRMNUMB;?? ?????? ?? ????}?? ??else????? ?????{?? ??????size?=?vd->framesizeIn;?? ??????len?=?<strong>read</strong>?(vd->fd,?vd->pFramebuffer,?size);?? ??????if?(len?<?0?)?? ????{?? ??????if(debug)?printf?("v4l?read?error\n");?? ??????if(debug)?printf?("len?%d?asked?%d?\n",?len,?size);?? ??????return?0;?? ????}?? ?????? ?????? ???????while((vd->framelock[vd->frame_cour]?!=?0)&&?vd->signalquit)?? ????usleep(1000);?? ????pthread_mutex_lock?(&vd->grabmutex);?? ??????????temps?=?ms_time();?? ?????jpegsize=?convertframe(vd->ptframe[vd->frame_cour]+?sizeof(struct?frame_t),?? ????????????vd->pFramebuffer?,?? ????????????vd->hdrwidth,vd->hdrheight,vd->formatIn,vd->framesizeIn);??? ?????? ?????headerframe=(struct?frame_t*)vd->ptframe[vd->frame_cour];?? ?????snprintf(headerframe->header,5,"%s","SPCA");??? ?????headerframe->seqtimes?=?ms_time();?? ?????headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);??? ?????headerframe->w?=?vd->hdrwidth;?? ?????headerframe->h?=?vd->hdrheight;?? ?????headerframe->size?=?((?jpegsize?<?0)?0:jpegsize);??? ?????headerframe->format?=?vd->formatIn;??? ?????headerframe->nbframe?=?frame++;??? ????? ?????? ????vd->frame_cour?=?(vd->frame_cour?+1)?%?OUTFRMNUMB;???? ????pthread_mutex_unlock?(&vd->grabmutex);??? ?????? ??????? ????}?? ??return?erreur;?? }?? 2、數據通過socket通信方式發送
[cpp] view plaincopy
for?(;;)?? ????{????? ??????????memset(&message,0,sizeof(struct?client_t));?? ???? ?????ret?=?read(sock,(unsigned?char*)&message,sizeof(struct?client_t));??? ??????????? ??????????? ?????else?if?(message.updosize){? ????????switch?(message.updosize){?? ????????case?1:?qualityUp(&videoIn);?? ????????break;?? ????????case?2:?qualityDown(&videoIn);?? ????????break;?? ????????}?? ????????ack?=?1;?? ????}??? ????? ?????else?if?(message.fps){?? ????????switch?(message.fps){?? ????????case?1:?timeDown(&videoIn);?? ????????break;?? ????????case?2:?timeUp(&videoIn);?? ????????break;?? ????????}?? ????????ack?=?1;?? ????}??? ????? ?????else?if?(message.sleepon){?? ????????ack?=?1;?? ?????}??? ?????else?ack?=0;?? ???????while?((frameout?==?videoIn.frame_cour)?&&?videoIn.signalquit)???usleep(1000);?? ???????if?(videoIn.signalquit){?? ????videoIn.framelock[frameout]++;?? ??????????headerframe?=?(struct?frame_t?*)?videoIn.ptframe[frameout];?? ??????headerframe->acknowledge?=?ack;?? ??????headerframe->bright?=?bright;?? ??????headerframe->contrast?=?contrast;?? ??????headerframe->wakeup?=?wakeup;?? ?????? ?????ret?=?write_sock(sock,?(unsigned?char?*)headerframe,?sizeof(struct?frame_t))?;???? ?????if(!wakeup)?????? ????? ?????ret?=?write_sock(sock,(unsigned?char*)(videoIn.ptframe[frameout]+sizeof(struct?frame_t)),headerframe->size);??????? ?????videoIn.framelock[frameout]--;?? ?????frameout?=?(frameout+1)%4;??????? ??????}?else?{?? ???????if(debug)?printf("reader?%d?going?out?\n",*id);?? ????break;?? ??????}?? ????}?? ??close_sock(sock);?? ??pthread_exit(NULL);?? }?? 二、接受與顯示程序 1、JPEG圖片壓縮原理
實際上,一個平面的圖像,可以理解為除了水平 X 和垂直 Y 以外,還有一個色彩值的 Z 的三維的系統。Z 代表了三元色中各個分支 R/G/B 的混合時所占的具體數值大小,每個像素的 RGB 的混合值可能都有所不同,各個值有大有小,但臨近的兩個點的 R/G/B 三個值會比較接近。兩個相鄰的點,會有很多的色彩是很接近的,那么如何能在最后得到的圖片中,盡量少得記錄這些不需要的數據, 也即達到了壓縮的效果。
總結
以上是生活随笔 為你收集整理的网络视频监控与人脸识别 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。