MA.cpp
上传用户:shopgift
上传日期:2022-07-27
资源大小:3k
文件大小:8k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. // OpenCV includes.
  5. #include <cv.h>
  6. #include <highgui.h>
  7.  
  8. using namespace std;
  9.  
  10. int main()
  11. {
  12. //Create a new window.
  13. cvNamedWindow("My Window", CV_WINDOW_AUTOSIZE);
  14.  
  15. //Create a new movie capture object.
  16. CvCapture* inputMovie;
  17. //Assign the movie to capture.
  18. inputMovie = cvCaptureFromAVI("SAM_0830.AVI");
  19. double width = cvGetCaptureProperty( inputMovie, CV_CAP_PROP_FRAME_WIDTH );
  20. //Size of the image.
  21. // CvSize imgSize;
  22. // imgSize.width = 320;
  23. // imgSize.height = 240;
  24.  
  25. //Images to use in the program.
  26. IplImage* colourImage;
  27. colourImage = cvQueryFrame(inputMovie);
  28. IplImage* greyImage = cvCreateImage( cvSize(colourImage->width, colourImage->height), IPL_DEPTH_8U, 1);
  29. IplImage* movingAverage = cvCreateImage( cvSize(colourImage->width, colourImage->height), IPL_DEPTH_32F, 3);
  30. IplImage* difference;
  31. IplImage* temp;
  32. IplImage* motionHistory = cvCreateImage( cvSize(colourImage->width, colourImage->height), IPL_DEPTH_8U, 3);
  33.  
  34. //Rectangle for bounding box of a objects.
  35. CvRect bndRect = cvRect(0,0,0,0);
  36.  
  37. //Points for the edges of the rectangle.
  38. CvPoint pt1, pt2;
  39.  
  40. //Create a font object.
  41. CvFont font;
  42.  
  43. //Create video to output to.
  44. CvVideoWriter* outputMovie = cvCreateVideoWriter("hw3_1(b).avi", 
  45. CV_FOURCC('D', 'I', 'V', 'X'), 29.97, cvSize(320, 240));
  46.  
  47. //Capture the movie frame by frame.
  48. int prevX = 0;
  49. int numCar = 0;
  50. int numBus = 0;
  51. int numPed = 0;
  52.  
  53. //Buffer to save the number of vehicles when converting the integer
  54. //to a string.
  55. char Scores[60];
  56.  
  57. //The center x of the rectangle.
  58. int avgX = 0;
  59.  
  60. //Indicates whether this is the first time in the loop of frames.
  61. bool first = true;
  62.  
  63. //Indicates the contour for left direction
  64. int Left = 0;
  65. // for the right.
  66. int Right = width;
  67. //Keep processing frames...
  68. while(true)
  69. {
  70. //Get a frame from the input video.
  71. colourImage = cvQueryFrame(inputMovie);
  72.  
  73. //If there are no more frames, jump out of the for.
  74. if( !colourImage )
  75. {
  76. break;
  77. }
  78. //If this is the first time, initialize the images.
  79. if(first)
  80. {
  81. difference = cvCloneImage(colourImage);
  82. temp = cvCloneImage(colourImage);
  83. cvConvertScale(colourImage, movingAverage, 1.0, 0.0);
  84. first = false;
  85. }
  86. //else, make a running average of the motion.
  87. else
  88. {
  89. cvRunningAvg(colourImage, movingAverage, 0.020, NULL);
  90. cvNamedWindow("Run Avg",1);
  91. cvShowImage( "Run Avg", greyImage );
  92. }
  93.  
  94. //Convert the scale of the moving average.
  95. cvConvertScale(movingAverage, temp, 1.0, 0.0);
  96. cvNamedWindow("Scale",1);
  97. cvShowImage( "Scale", greyImage );
  98. //Minus the current frame from the moving average.
  99. cvAbsDiff(colourImage,temp,difference);
  100. cvNamedWindow("Difference",1);
  101. cvShowImage( "Difference", greyImage );
  102. //Convert the image to grayscale.
  103. cvCvtColor(difference, greyImage, CV_RGB2GRAY);
  104. //Convert the image to black and white.
  105. cvThreshold(greyImage, greyImage, 97, 255, CV_THRESH_BINARY);
  106. cvNamedWindow("Thresh",1);
  107. cvShowImage( "Thresh", greyImage );
  108. cvDilate(greyImage, greyImage, 0, 18);
  109. cvNamedWindow("Dilate",1);
  110. cvShowImage( "Dilate", greyImage );
  111. cvErode(greyImage, greyImage, 0, 10);
  112. cvNamedWindow("Motion",1);
  113. cvShowImage( "Motion", greyImage );
  114. //Find the contours of the moving images in the frame.
  115. CvMemStorage* storage = cvCreateMemStorage(0);
  116.         CvSeq* contour = 0;
  117. cvFindContours( greyImage, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
  118.  
  119. //Process each moving contour in the current frame...
  120.         for( ; contour != 0; contour = contour->h_next )
  121.         {
  122. //Get a bounding box around the moving object.
  123. bndRect = cvBoundingRect(contour, 0);
  124.  
  125. pt1.x = bndRect.x;
  126. pt1.y = bndRect.y;
  127. pt2.x = bndRect.x + bndRect.width;
  128. pt2.y = bndRect.y + bndRect.height;
  129.       printf("============================n");
  130.       printf("%d, %dn", pt1.x, pt2.x);
  131.       printf("%d, %dn", pt1.y, pt2.y);
  132.       printf("%dn",bndRect.width);
  133. //Get an average X position of the moving contour.
  134. avgX = (pt1.x + pt2.x) / 2;
  135.       printf("avgX----%dn", avgX);
  136.  
  137. //If the contour is within the edges of the building...
  138. if(avgX > 90 && avgX < 250)
  139. {
  140.         printf("Left --- %dn", Left);
  141. //If the the previous contour was within 2 of the left boundary...
  142. if(Left >= 87 && Left <= 90)
  143. {
  144. //If the current X position is greater than the previous...
  145. if(avgX > prevX)
  146. {
  147.             
  148. //Increase the number of objects.
  149. if( bndRect.width > 180 && pt1.y < 70 ){
  150.                numBus++;
  151.                printf("num-%d, width-%dn", numBus,bndRect.width );}
  152.             else if( bndRect.width > 120 && bndRect.width < 200){
  153.   numCar++;
  154.             printf("num-%d, width-%dn", numCar, bndRect.width); }
  155.             else if( bndRect.width < 100 ){
  156.                   numPed ++;
  157.                   printf("num-%d,width-%dn", numPed, bndRect.width);}
  158. //Reset the closest object to the left indicator.
  159. Left = 0;
  160. }
  161. }
  162. //else if the previous contour was within 2 of the right boundary...
  163. else if(Right >= 250 && Right <= 252)
  164. {
  165.           printf("Right --- %dn", Right);
  166. //If the current X position is less than the previous...
  167. if(avgX < prevX)
  168. {
  169.             //Increase the number of objects.
  170. if(bndRect.width > 180 && pt1.y < 70){
  171.               numBus++;
  172.             printf("R - %dn", numBus);}
  173.             else if(bndRect.width > 120 && bndRect.width < 200){
  174.   numCar++;
  175.             printf("R - %d, width-%dn", numCar, bndRect.width);}
  176.             else if( bndRect.width < 100 && pt2.y < 75){
  177.                numPed++;
  178.             printf("R - %d, width-%dn", numPed, bndRect.width);}
  179.  
  180. //Reset the closest object to the right counter.
  181. Right = 320;
  182. }
  183.           
  184. }
  185.  
  186. //Draw the bounding rectangle around the moving object.
  187. cvRectangle(colourImage, pt1, pt2, CV_RGB(255,0,0), 1);
  188. }
  189.       else if(pt1.x == 1 && pt2.x == 15 && numCar != 5 && numCar != 2){
  190.        numCar ++;
  191.       printf("exception : %d, width-%dn", numCar, bndRect.width);}
  192. //If the current object is closer to the left boundary but still not across
  193. //it, then change the closest to the left counter to this value.
  194. if(avgX > Left && avgX <= 90)
  195. {
  196. Left = avgX;
  197. }
  198.  
  199. //If the current object is closer to the right boundary but still not across
  200. //it, then change the closest to the right counter to this value.
  201. if(avgX < Right && avgX >= 250)
  202. {
  203. Right = avgX;
  204. }
  205.  
  206. //Save the current X value to use as the previous in the next iteration.
  207. prevX = avgX;
  208.       printf("prev-----%dn",prevX );
  209.         }
  210. sprintf(Scores, " %d/ %d/ %d", numBus, numCar, numPed);
  211.     printf("%d, %d, %dn", numBus, numCar, numPed);
  212. //Write the number vehicle counted at the top of the output frame.
  213. cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.8, 0.8, 0, 2);
  214. cvPutText(colourImage, Scores, cvPoint(60, 200), &font, cvScalar(0, 0, 300));
  215. //Show the frame.
  216. cvShowImage("My Window", colourImage);
  217. //Wait for the user to see it.
  218. cvWaitKey(1);
  219.     printf("one framen"); 
  220. //Write the frame to the output movie.
  221. cvWriteFrame(outputMovie, colourImage);
  222. }
  223.  
  224. // Destroy the image, movies, and window.
  225. cvReleaseImage(&temp);
  226. cvReleaseImage(&difference);
  227. cvReleaseImage(&greyImage);
  228. cvReleaseImage(&movingAverage);
  229. cvDestroyWindow("My Window");
  230.  
  231. cvReleaseCapture(&inputMovie);
  232. cvReleaseVideoWriter(&outputMovie);
  233.  
  234. return(0);
  235. }