OpenCV實現(xiàn)幀差法檢測運動目標
更新時間:2020年03月21日 09:25:15 作者:DY580C
這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)幀差法檢測運動目標,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
今天的目標是用OpenCV實現(xiàn)對運動目標的檢測,這里選用三幀幀差法。代碼如下:
#include <opencv2/opencv.hpp>
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <ctype.h>
double Threshold_index=0;
const int CONTOUR_MAX_AERA = 200;
void trackbar(int pos)
{
Threshold_index=(double)pos;
}
int main(int argc, char* argv[])
{
CvCapture *capture=cvCaptureFromCAM(0);
int n_cnt=0;
IplImage *img=NULL,
*img_gray1=NULL,
*img_gray2=NULL,
*img_gray3=NULL,
*img_diff1=NULL,
*img_diff2=NULL,
*img_diff_and=NULL,
*img_binary=NULL,
*img_dilate=NULL;
CvMemStorage *stor;
CvSeq *cont;
stor=cvCreateMemStorage(0);
cont=cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor);
cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
cvNamedWindow("dilate",CV_WINDOW_AUTOSIZE);
img=cvQueryFrame(capture);
img_gray1=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
img_gray2=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
img_gray3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
img_diff1=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
img_diff2=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
img_diff_and=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
img_binary=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
img_dilate=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
int index=1;
cvCreateTrackbar("Threshold","test",&index,255,trackbar);
while(img=cvQueryFrame(capture))
{
if(n_cnt%3==0)
cvCvtColor(img,img_gray1,CV_BGR2GRAY);
else if(n_cnt%3==1)
cvCvtColor(img,img_gray2,CV_BGR2GRAY);
else if(n_cnt%3==2)
cvCvtColor(img,img_gray3,CV_BGR2GRAY);
char c=(char)cvWaitKey(25);
if(c==27)
break;
if(n_cnt>3)
{
cvAbsDiff(img_gray1,img_gray2,img_diff1);
cvAbsDiff(img_gray2,img_gray3,img_diff2);
cvAnd(img_diff1,img_diff2,img_diff_and);
cvThreshold(img_diff_and,img_binary,Threshold_index,255,CV_THRESH_BINARY);
cvShowImage("test",img_binary);
cvDilate(img_binary,img_dilate);
//cvShowImage("dilate",img_dilate);
cvFindContours(img_dilate,stor,&cont,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
for(;cont;cont = cont->h_next)
{
CvRect r = ((CvContour*)cont)->rect;//子類轉(zhuǎn)換為父類例子
if(r.height * r.width > CONTOUR_MAX_AERA) // 面積小的方形拋棄掉
{
cvRectangle(img, cvPoint(r.x,r.y),
cvPoint(r.x + r.width, r.y + r.height),
CV_RGB(255,0,0), 1, CV_AA,0);
}
}
cvShowImage("dilate",img);
}
if(c=='s')
{
cvSaveImage("d:/img.bmp",img);
cvSaveImage("d:/img_binary.bmp",img_dilate);
}
n_cnt++;
}
cvDestroyAllWindows();
cvReleaseCapture(&capture);
cvReleaseImage(&img_gray1);
cvReleaseImage(&img_gray2);
cvReleaseImage(&img_gray3);
cvReleaseImage(&img_diff1);
cvReleaseImage(&img_diff2);
cvReleaseImage(&img_diff_and);
cvReleaseImage(&img_binary);
cvReleaseImage(&img_dilate);
cvReleaseMemStorage(&stor);
return 0;
}
下圖是檢測的運動目標二值化圖像以及在實際圖像中疊加的矩形框效果圖。


以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++使用TinyXML2實現(xiàn)解析和生成XML數(shù)據(jù)
TinyXML2是一個輕量級的、開源的C++庫,專門用于解析和生成XML文檔,本文主要為大家介紹了如何使用TinyXML2實現(xiàn)解析和生成XML數(shù)據(jù),需要的可以參考下2024-04-04
C++深入淺出探索數(shù)據(jù)結(jié)構(gòu)的原理
C++的數(shù)據(jù)結(jié)構(gòu)很多,很復(fù)雜,所以本文將通過示例帶大家深入了解一下C++中的數(shù)據(jù)結(jié)構(gòu)與算法。文中的示例代碼講解詳細,感興趣的可以了解一下2022-05-05
詳解C++中StringBuilder類的實現(xiàn)及其性能優(yōu)化
在Java和C#中,StringBuilder可以創(chuàng)造可變字符序列來動態(tài)地擴充字符串,那么在C++中我們同樣也可以實現(xiàn)一個StringBuilder并且用來提升性能,下面就來詳解C++中StringBuilder類的實現(xiàn)及其性能優(yōu)化2016-05-05

