服务器之家

服务器之家 > 正文

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

时间:2021-08-27 14:03     来源/作者:DY580C

今天的目标是用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

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部