介绍
这篇文章将为大家详细讲解有关OpenCV如何实现帧差法检测运动目标,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
代码如下:
# include & lt; opencv2/opencv.hpp> # include & lt; cv.h> # include & lt; highgui.h> # include & lt; stdio.h> # include & lt; ctype.h> double Threshold_index=0; 时间=const int  CONTOUR_MAX_AERA 200; void trackbar (int pos) { pos, Threshold_index=(双); } 命令行参数个数,int 主要(int char *, argv []) {, ,CvCapture *捕捉=cvCaptureFromCAM (0); ,int n_cnt=0; ,IplImage * img=零, * img_gray1=零, * img_gray2=零, * img_gray3=零, * img_diff1=零, * img_diff2=零, * img_diff_and=零, * img_binary=零, ,* img_dilate=零; ,CvMemStorage *的; ,CvSeq *续; ,大的=cvCreateMemStorage (0); ,续=cvCreateSeq (CV_SEQ_ELTYPE_POINT sizeof (CvSeq), sizeof (CvPoint)的专用); ,cvNamedWindow (“test" CV_WINDOW_AUTOSIZE); ,cvNamedWindow (“dilate" CV_WINDOW_AUTOSIZE); ,img=cvQueryFrame(捕捉); ,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 指数=1; ,cvCreateTrackbar (“Threshold",“test",,指数,255年,trackbar); ,而(img=cvQueryFrame(捕捉)) ,{ ,如果(n_cnt % 3==0) cvCvtColor才能(img, img_gray1 CV_BGR2GRAY); ,else 如果(n_cnt % 3==1) cvCvtColor才能(img, img_gray2 CV_BGR2GRAY); ,else 如果(n_cnt % 3==2) cvCvtColor才能(img, img_gray3 CV_BGR2GRAY); ,char c=(char) cvWaitKey (25); ,如果(c==27) 打破才能; ,如果(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、存储的,续,sizeof (CvContour) CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint (0, 0)); ,,(;控制器;cont =,续→h_next) {才能 ,,CvRect r =, ((CvContour *)控制)→矩形;//子类转换为父类例子 ,,如果(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); ,} ,如果(c==& # 39; & # 39;) ,{ cvSaveImage才能(“d:/img.bmp", img); cvSaveImage才能(“d:/img_binary.bmp" img_dilate); ,} ,n_cnt + +; ,} ,cvDestroyAllWindows (); ,cvReleaseCapture(和捕获); ,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(及存储的); ,return 0; }
下图是检测的运动目标二值化图像以及在实际图像中叠加的矩形框效果图。
关于“OpenCV如何实现帧差法检测运动目标”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看的到。