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

时间:2022-04-08 22:17:41

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

  1. #include <opencv2/opencv.hpp>
  2. #include <cv.h>
  3. #include <highgui.h>
  4. #include <stdio.h>
  5. #include <ctype.h>
  6.  
  7. double Threshold_index=0;
  8. const int CONTOUR_MAX_AERA = 200;
  9.  
  10. void trackbar(int pos)
  11. {
  12. Threshold_index=(double)pos;
  13. }
  14.  
  15. int main(int argc, char* argv[])
  16. {
  17. CvCapture *capture=cvCaptureFromCAM(0);
  18. int n_cnt=0;
  19. IplImage *img=NULL,
  20. *img_gray1=NULL,
  21. *img_gray2=NULL,
  22. *img_gray3=NULL,
  23. *img_diff1=NULL,
  24. *img_diff2=NULL,
  25. *img_diff_and=NULL,
  26. *img_binary=NULL,
  27. *img_dilate=NULL;
  28. CvMemStorage *stor;
  29. CvSeq *cont;
  30.  
  31. stor=cvCreateMemStorage(0);
  32. cont=cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor);
  33.  
  34. cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
  35. cvNamedWindow("dilate",CV_WINDOW_AUTOSIZE);
  36. img=cvQueryFrame(capture);
  37. img_gray1=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
  38. img_gray2=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
  39. img_gray3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
  40. img_diff1=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
  41. img_diff2=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
  42. img_diff_and=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
  43. img_binary=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
  44. img_dilate=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
  45.  
  46. int index=1;
  47. cvCreateTrackbar("Threshold","test",&index,255,trackbar);
  48.  
  49. while(img=cvQueryFrame(capture))
  50. {
  51. if(n_cnt%3==0)
  52. cvCvtColor(img,img_gray1,CV_BGR2GRAY);
  53. else if(n_cnt%3==1)
  54. cvCvtColor(img,img_gray2,CV_BGR2GRAY);
  55. else if(n_cnt%3==2)
  56. cvCvtColor(img,img_gray3,CV_BGR2GRAY);
  57. char c=(char)cvWaitKey(25);
  58. if(c==27)
  59. break;
  60. if(n_cnt>3)
  61. {
  62. cvAbsDiff(img_gray1,img_gray2,img_diff1);
  63. cvAbsDiff(img_gray2,img_gray3,img_diff2);
  64. cvAnd(img_diff1,img_diff2,img_diff_and);
  65. cvThreshold(img_diff_and,img_binary,Threshold_index,255,CV_THRESH_BINARY);
  66. cvShowImage("test",img_binary);
  67.  
  68. cvDilate(img_binary,img_dilate);
  69. //cvShowImage("dilate",img_dilate);
  70.  
  71. cvFindContours(img_dilate,stor,&cont,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
  72. for(;cont;cont = cont->h_next)
  73. {
  74. CvRect r = ((CvContour*)cont)->rect;//子类转换为父类例子
  75. if(r.height * r.width > CONTOUR_MAX_AERA) // 面积小的方形抛弃掉
  76. {
  77. cvRectangle(img, cvPoint(r.x,r.y),
  78. cvPoint(r.x + r.width, r.y + r.height),
  79. CV_RGB(255,0,0), 1, CV_AA,0);
  80. }
  81. }
  82. cvShowImage("dilate",img);
  83. }
  84. if(c=='s')
  85. {
  86. cvSaveImage("d:/img.bmp",img);
  87. cvSaveImage("d:/img_binary.bmp",img_dilate);
  88. }
  89. n_cnt++;
  90. }
  91.  
  92. cvDestroyAllWindows();
  93. cvReleaseCapture(&capture);
  94. cvReleaseImage(&img_gray1);
  95. cvReleaseImage(&img_gray2);
  96. cvReleaseImage(&img_gray3);
  97. cvReleaseImage(&img_diff1);
  98. cvReleaseImage(&img_diff2);
  99. cvReleaseImage(&img_diff_and);
  100. cvReleaseImage(&img_binary);
  101. cvReleaseImage(&img_dilate);
  102. cvReleaseMemStorage(&stor);
  103. return 0;
  104. }

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

原文链接:https://blog.csdn.net/DY580C/article/details/35859551