当前位置:首页 > 通信资讯 > 正文

opencv帧间差分法(opencv获取帧率)

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

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

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

opencv帧间差分法(opencv获取帧率)

opencv帧间差分法(opencv获取帧率)

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

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

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。