天天看點

OpenCV讀視訊檔案和運動物體檢測

簡要說明:本程式 嘗試打開本電腦上的攝像頭作為視訊輸入裝置,或者将指令行的輸入參數作為檔案名來打開的視訊檔案。不管是哪一種方法,最後都是不斷的循環處理一幀一幀地處理,涉及到的圖像處理有 背景擦除,平滑濾波,二值化等。

轉自:

<a href="http://www.opencv.org.cn/index.php/%E8%AF%BB%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%92%8C%E8%BF%90%E5%8A%A8%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B" target="_blank">http://www.opencv.org.cn/index.php/%E8%AF%BB%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%92%8C%E8%BF%90%E5%8A%A8%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B</a>

有微小調整。在VS2005+OpenCV下調試通過。

#include &lt;stdafx.h&gt; 

#include &lt;stdio.h&gt; 

#include &lt;cv.h&gt; 

#include &lt;cxcore.h&gt; 

#include &lt;highgui.h&gt; 

int main( int argc, char** argv ) 

    //聲明IplImage指針 

    IplImage* pFrame = NULL;  

    IplImage* pFrImg = NULL; 

    IplImage* pBkImg = NULL; 

    CvMat* pFrameMat = NULL; 

    CvMat* pFrMat = NULL; 

    CvMat* pBkMat = NULL; 

    CvCapture* pCapture = NULL; 

    int nFrmNum = 0; 

    //建立視窗 

    cvNamedWindow("video", 1); 

    cvNamedWindow("background",1); 

    cvNamedWindow("foreground",1); 

    //使視窗有序排列 

    cvMoveWindow("video", 30, 0); 

    cvMoveWindow("background", 360, 0); 

    cvMoveWindow("foreground", 690, 0); 

    if( argc &gt; 2 ) 

    { 

        fprintf(stderr, "Usage: bkgrd [video_file_name]\n"); 

        return -1; 

    } 

    //打開攝像頭 

    if (argc ==1) 

        if( !(pCapture = cvCaptureFromCAM(0))) 

        { 

            fprintf(stderr, "Can not open camera.\n"); 

            return -2; 

        } 

    //打開視訊檔案 

    if(argc == 2) 

        if( !(pCapture = cvCaptureFromFile(argv[1]))) 

            fprintf(stderr, "Can not open video file %s\n", argv[1]); 

    //逐幀讀取視訊 

    while(pFrame = cvQueryFrame( pCapture )) 

        nFrmNum++; 

        //如果是第一幀,需要申請記憶體,并初始化 

        if(nFrmNum == 1) 

            pBkImg = cvCreateImage(cvSize(pFrame-&gt;width, pFrame-&gt;height),  IPL_DEPTH_8U,1); 

            pFrImg = cvCreateImage(cvSize(pFrame-&gt;width, pFrame-&gt;height),  IPL_DEPTH_8U,1); 

            pBkMat = cvCreateMat(pFrame-&gt;height, pFrame-&gt;width, CV_32FC1); 

            pFrMat = cvCreateMat(pFrame-&gt;height, pFrame-&gt;width, CV_32FC1); 

            pFrameMat = cvCreateMat(pFrame-&gt;height, pFrame-&gt;width, CV_32FC1); 

            //轉化成單通道圖像再處理 

            cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY); 

            cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); 

            cvConvert(pFrImg, pFrameMat); 

            cvConvert(pFrImg, pFrMat); 

            cvConvert(pFrImg, pBkMat); 

        else 

            //高斯濾波先,以平滑圖像 

            //cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0); 

            //目前幀跟背景圖相減 

            cvAbsDiff(pFrameMat, pBkMat, pFrMat); 

            //二值化前景圖 

            cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY); 

            //進行形态學濾波,去掉噪音   

            //cvErode(pFrImg, pFrImg, 0, 1); 

            //cvDilate(pFrImg, pFrImg, 0, 1); 

            //更新背景 

            cvRunningAvg(pFrameMat, pBkMat, 0.003, 0); 

            //将背景轉化為圖像格式,用以顯示 

            cvConvert(pBkMat, pBkImg); 

            //顯示圖像 

            cvShowImage("video", pFrame); 

            cvShowImage("background", pBkImg); 

            cvShowImage("foreground", pFrImg); 

            //如果有按鍵事件,則跳出循環 

            //此等待也為cvShowImage函數提供時間完成顯示 

            //等待時間可以根據CPU速度調整 

            if( cvWaitKey(2) &gt;= 0 ) 

                break; 

    //銷毀視窗 

    cvDestroyWindow("video"); 

    cvDestroyWindow("background"); 

    cvDestroyWindow("foreground"); 

    //釋放圖像和矩陣 

    cvReleaseImage(&amp;pFrImg); 

    cvReleaseImage(&amp;pBkImg); 

    cvReleaseMat(&amp;pFrameMat); 

    cvReleaseMat(&amp;pFrMat); 

    cvReleaseMat(&amp;pBkMat); 

    cvReleaseCapture(&amp;pCapture); 

    return 0; 

本文轉自 h2appy  51CTO部落格,原文連結:http://blog.51cto.com/h2appy/278918,如需轉載請自行聯系原作者

繼續閱讀