opencv簡單背景建模

來源:互聯網
上載者:User
#include <cv.h>#include <cxcore.h>#include <highgui.h>int main(){//聲明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;pCapture = cvCaptureFromFile("bike.avi");//自己選取一段avi視頻//建立視窗cvNamedWindow("Video", 1);cvNamedWindow("Background",1);cvNamedWindow("Foreground",1);//使視窗有序排列,視窗寬330cvMoveWindow("Video", 30, 0);cvMoveWindow("Background", 360, 0);cvMoveWindow("Foreground", 690, 0);//逐幀讀取視頻while(pFrame = cvQueryFrame( pCapture )){nFrmNum++;//如果是第一幀,需要申請記憶體,並初始化if(nFrmNum == 1){pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1); // 存放背景映像(灰階)pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1); // 存放中間映像(灰階)pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//轉化成單通道映像再處理(灰階)cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);cvConvert(pFrImg, pFrameMat);cvConvert(pFrImg, pFrMat);cvConvert(pFrImg, pBkMat);}else{cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); //轉化成單通道映像再處理(灰階)cvConvert(pFrImg, pFrameMat);//高斯濾波先,以平滑映像//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);// 保持原映像的旋轉方向pBkImg->origin = pFrImg->origin = pFrame->origin;//顯示映像cvShowImage("Video", pFrame);cvShowImage("Background", pBkImg);cvShowImage("Foreground", pFrImg);//如果有按鍵事件,則跳出迴圈//此等待也為cvShowImage函數提供時間完成顯示//等待時間可以根據CPU速度調整if( cvWaitKey(200) >= 0 )break;}}//銷毀視窗cvDestroyWindow("Video");cvDestroyWindow("Background");cvDestroyWindow("Foreground");//釋放映像和矩陣cvReleaseImage(&pFrImg);cvReleaseImage(&pBkImg);cvReleaseMat(&pFrameMat);cvReleaseMat(&pFrMat);cvReleaseMat(&pBkMat);cvReleaseCapture(&pCapture);return 0;}

有時間用c++版本重寫,以對兩者的區別有更清楚的認識。Mat , IplImage相互轉化等。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.