溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于OpenCv中運(yùn)動(dòng)物體檢測(cè)算法的示例分析

發(fā)布時(shí)間:2021-06-11 14:23:20 來(lái)源:億速云 閱讀:266 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“基于OpenCv中運(yùn)動(dòng)物體檢測(cè)算法的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“基于OpenCv中運(yùn)動(dòng)物體檢測(cè)算法的示例分析”這篇文章吧。

基于一個(gè)實(shí)現(xiàn)的基于OpenCv的運(yùn)動(dòng)物體檢測(cè)算法,可以用于檢測(cè)行人或者其他運(yùn)動(dòng)物體。

#include <stdio.h>  
#include <cv.h>  
#include <cxcore.h>  
#include <highgui.h>  
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;  
 //創(chuàng)建窗口   
 cvNamedWindow("video", 1);  
 cvNamedWindow("background",1);  
 cvNamedWindow("foreground",1);  
 //使窗口有序排列  
 cvMoveWindow("video", 30, 0);  
 cvMoveWindow("background", 360, 0);  
 cvMoveWindow("foreground", 690, 0);  
 argc = 1; 
  
 if( argc > 2 )  
  {  
   fprintf(stderr, "Usage: bkgrd [video_file_name]\n");  
   return -1;  
  }  
 //打開(kāi)攝像頭  
 if (argc ==1)  
  if( !(pCapture = cvCaptureFromCAM(-1)))  
   {  
  fprintf(stderr, "Can not open camera.\n");  
  return -2;  
   }  
 //打開(kāi)視頻文件  
 if(argc == 2)  
  if( !(pCapture = cvCaptureFromFile(argv[1])))  
   {  
  fprintf(stderr, "Can not open video file %s\n", argv[1]);  
  return -2;  
   }  
   
 //逐幀讀取視頻  
 while(pFrame = cvQueryFrame( pCapture ))  
  {  
   nFrmNum++;  
     
   //如果是第一幀,需要申請(qǐng)內(nèi)存,并初始化  
   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);  
   //轉(zhuǎn)化成單通道圖像再處理  
   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);  
     
   //當(dāng)前幀跟背景圖相減  
   cvAbsDiff(pFrameMat, pBkMat, pFrMat);  
   //二值化前景圖  
   cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);  
   //進(jìn)行形態(tài)學(xué)濾波,去掉噪音   
   //cvErode(pFrImg, pFrImg, 0, 1);  
   //cvDilate(pFrImg, pFrImg, 0, 1);  
   //更新背景  
   cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);  
   //將背景轉(zhuǎn)化為圖像格式,用以顯示  
   cvConvert(pBkMat, pBkImg);  
   //顯示圖像  
   cvShowImage("video", pFrame);  
   cvShowImage("background", pBkImg);  
   cvShowImage("foreground", pFrImg);  
   //如果有按鍵事件,則跳出循環(huán)  
   //此等待也為cvShowImage函數(shù)提供時(shí)間完成顯示   
   //等待時(shí)間可以根據(jù)CPU速度調(diào)整  
   if( cvWaitKey(2) >= 0 )  
    break;  
  
  }  
  }  
    
 //銷毀窗口  
 cvDestroyWindow("video");  
 cvDestroyWindow("background");  
 cvDestroyWindow("foreground");  
 //釋放圖像和矩陣  
 cvReleaseImage(&pFrImg);  
 cvReleaseImage(&pBkImg);  
 cvReleaseMat(&pFrameMat);  
 cvReleaseMat(&pFrMat);  
 cvReleaseMat(&pBkMat);  
 cvReleaseCapture(&pCapture);  
 return 0;  
}

以上是“基于OpenCv中運(yùn)動(dòng)物體檢測(cè)算法的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI