視頻摘要視頻濃縮


視頻摘要 視頻濃縮(一)

視頻摘要又稱視頻濃縮,是對視頻內容的一個簡單概括,以自動或半自動的方式,先通過運動目標分析,提取運動目標,然后對各個目標的運動軌跡進行分析,將不同的目標拼接到一個共同的背景場景中,並將它們以某種方式進行組合。視頻摘要在視頻分析和基於內容的視頻檢索中扮演着重要角色。

視頻錄像存在存儲數據量大,存儲時間長等特點,通過錄像尋找線索,獲取證據傳統的做法是要耗費大量人力、物力以及時間,效率極其低下,以至於錯過最佳破案時機。因此在視頻監控系統中,對原始視頻進行濃縮,可以快速瀏覽,鎖定檢索對象,對於公安加快破案速度,提高大案、要案的破案效率具有重要指導意義。(1)

對於企業應用來說,視頻摘要與壓縮技術可以使企業管理人員在短時間內瀏覽完視頻。在智能手機大行其道的今天,使用視頻摘要技術對監控視頻進行處理,供手機瀏覽,既可以節約管理者的時間,又可以節約大量的流量。(2)

對於我來說,現在存在監控錄像查閱的實際需求,更重要的是這個問題是“圖像處理”的一個典型運用,非常值得研究探索。所以在這里進行研究和實現
 
一、行業背景和划分
      97年CMU的informedia是針對新聞視頻的,而MoCA是針對電影的。在監控視頻方面以色列briefcam是行業領導者,此外還有哥倫比亞大學的VideoQ和IBM的CueVideo。國內這塊處於初級發展狀態。
      視頻摘要可以繼續划分為
       1、圖片關鍵幀(提取一些視頻截圖);
       2、剪膠片(機器去除靜止畫面,只顯示有目標的畫面);
       3、空間換時間(不同時間的事件顯示在同一畫面)。
       第3基本上就是能夠用於商業運用的視頻摘要項目,類似提供這樣效果。(注意圖上的兩組人是不同時間的人)。
       當然了,真實的視頻可能是這樣的

       我這里實驗的背景,首先以768那個avi,然后以營區監控來做(opencv3.0自帶視頻 
768x576.avi)
二、關鍵技術和算法流程
       (一)背景建模
       背景建模的基(you)本(xiao)方法是“背景建模”。能夠找到的方法包括(1)均值法(2)中值法(3)滑動平均濾波(4)單高斯(5)混合高斯模型(6)codebook方法。我這里實現( 1)均值法(3)滑動濾波法和(5)混合高斯法
       (1) 均值法
      對於768*576.avi這個視頻來說,是比較經典的監控視頻,其特點是主要背景景物、光照等是不變的,前景人物來回走動。處理這種問題,如果想把背景取出來,最直接的方法就是統計一個階段的幀(比如1到100)中,圖像中每個像素在絕大多數時間里面的顏色。
       如果直接求平均值,結果是這樣的
       應該說這種方法是有一定效果的,特別對於背景都是遠景,或者變化不是很大的情況,處理的效果比較好。
       但是對於前進的圖像晃動,效果就不是很理想。
       使用第0幀和平均值求absdiff,可以看到那個標識牌是很明顯地被認為是前景了。這個效果應該不是太好。
void GoBgModeling( const  char  * videoFilePath,  const  int frame_num_used, Mat * bgMat, \
     const  int size1,  const  int size2,  const  int sigma1,  const  int sigma2 ){
     //聲明
     int frame_no  =  0;
    Mat frame;
    Mat tmp;
    VideoCapture pCapture(videoFilePath); //自己選取一段avi視頻
     if( !pCapture.isOpened()){
        printf( "Unable to open video file for background modeling!\n");
         return;
    }
    printf( "Background Modeling...\n");
     //逐幀讀取視頻
    Mat matTmp;
     while(frame_no  < frame_num_used){
        pCapture >>frame;
        frame.convertTo(frame,CV_32FC3);
        frame_no  +=  1;
         if(frame_no  ==  1){
             //初始化
            tmp  = Mat : :zeros(frame.rows,frame.cols,CV_32FC3);
            matTmp  = frame.clone();
        }
        tmp  = tmp  + frame /frame_num_used;
         *bgMat  = tmp;
    }
    bgMat - >convertTo( *bgMat,CV_8UC3);
    matTmp.convertTo(matTmp,CV_8UC3);
    absdiff(matTmp, *bgMat,matTmp);   
    printf( "Background Model has been achieved!\n");
}
    
      (2)滑動濾波法
     /* Adds image to accumulator with weights: acc = acc*(1-alpha) + image*alpha */
      這種方法的原理我搞的不是很清楚,如果采用這種方法計算背景的話,越是在前面的圖片,其權重被設定的越大。同樣的視頻結果如下
這個結果我看還不如均值。
/**
 *背景建模
 */

void bgModeling( const  char  * videoFilePath,  const  int frame_num_used, IplImage  * * bgImg, \
     const  int size1,  const  int size2,  const  int sigma1,  const  int sigma2){
     //聲明
    IplImage  * frame  = NULL;
    CvMat  * frameMat  = NULL;
    CvMat  * bgMat  = NULL;
    CvCapture * pCapture  = NULL;
    IplImage   * framtmp  = NULL;
    CvMat  * mattmp  = NULL;
     int frame_no  =  0;
    pCapture  = cvCaptureFromFile(videoFilePath); //自己選取一段avi視頻
     if( !pCapture){
        printf( "Unable to open video file for background modeling!\n");
         return;
    }
     if( *bgImg  != NULL){ //非空需先清空*bgImg指向的內存
        cvReleaseImage(bgImg);
    }
    printf( "Background Modeling...\n");
     //逐幀讀取視頻
     while(frame_no  < frame_num_used){
        frame  = cvQueryFrame(pCapture);
        frame_no  +=  1;
         if(frame_no  ==  1){
             //初始化
            framtmp  = cvCreateImage(cvSize(frame - >width, frame - >height), frame - >depth, frame - >nChannels);
            cvCopy(frame,framtmp);
             *bgImg  = cvCreateImage(cvSize(frame - >width, frame - >height), frame - >depth, frame - >nChannels);
            cvCopy(frame,  *bgImg);
            frameMat  = cvCreateMat(frame - >height, frame - >width, CV_32FC3);
            bgMat  = cvCreateMat(( *bgImg) - >height, ( *bgImg) - >width, CV_32FC3);
            cvConvert(frame, frameMat);
            cvConvert( *bgImg, bgMat);
             continue;
        }
         //視頻幀IplImage轉CvMat
        cvConvert(frame, frameMat);
         //高斯濾波先,以平滑圖像
        cvSmooth(frame, frame, CV_GAUSSIAN, size1, size2, sigma1, sigma2);
         //滑動平均更新背景(求平均)
        cvRunningAvg(frameMat, bgMat, ( double) 1 /frame_num_used);
    
    }
    
    cvConvert(bgMat,  *bgImg);
    printf( "Background Model has been achieved!\n");
     //釋放內存
    cvReleaseCapture( &pCapture);
    cvReleaseMat( &frameMat);
    cvReleaseMat( &bgMat);
}
       (3) 混合 高斯模型
        int  _tmain( int  argc, _TCHAR *  argv[])
{    
    Mat bgMat;
//    GoBgModeling("1.avi",100,&bgMat);
    cv : :VideoCapture capture;  
    capture.open( "1.avi");  
  
     if ( !capture.isOpened())  
    {  
        std : :cout << "read video failure" <<std : :endl;  
         return  - 1;  
    }  
    cv : :BackgroundSubtractorMOG2 mog;  
  
    cv : :Mat foreground;  
    cv : :Mat background;  
  
    cv : :Mat frame;  
     long frameNo  =  0;  
     while (capture.read(frame))  
    {  
         ++frameNo;  
        std : :cout <<frameNo <<std : :endl;  
         // 運動前景檢測,並更新背景  
        mog(frame, foreground,  0. 001);         
         // 腐蝕  
        cv : :erode(foreground, foreground, cv : :Mat());         
         // 膨脹  
        cv : :dilate(foreground, foreground, cv : :Mat());  
        mog.getBackgroundImage(background);    // 返回當前背景圖像  
        cv : :imshow( "video", foreground);  
        cv : :imshow( "background", background);  
         if (cv : :waitKey( 25>  0)  
        {  
             break;  
        }  
    }  
     return  0;
}
       這里雖然是直接使用了opencv提供的Mog模塊,應該說效果相當不錯。但是也需要對mog的基本原理進行理清和理解,並且對opencv的實現進行整理,這樣才算吃透知識。
      
 
 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM