OpenCV实现帧差法检测运动目标分享!

今天的目标是用OpenCV实现对运动目标的检测,这里选用三帧帧差法。代码如下:

  #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;//子类转换为父类例子     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;  }

下图是检测的运动目标二值化图像以及在实际图像中叠加的矩形框效果图。

OpenCV实现帧差法检测运动目标

OpenCV实现帧差法检测运动目标

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

—-想了解OpenCV实现帧差法检测运动目标分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/484260.html

(0)
上一篇 2020年11月10日
下一篇 2020年11月10日

精彩推荐